Hex Artifact Content

Artifact d77314704b3665d2125bab9ff21f8acbf5f78fe1d073114a529baf1e285b4559:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c  ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65  = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29  rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20     ok = 1;..}.  
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45    } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68  rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  }..    Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20   * InfoCallback 
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52   process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f  static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20  re, int ret) {. 
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70   *minor;..    dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66  .return;..    if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54  _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20   = "start";.    
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a  AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65  ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f  _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c  r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d  SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22  ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50  e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63  T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26  ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d   SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09  inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09   SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b  minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09   & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b  .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09   & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b  .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72  ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bd0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09  .ver = "none";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1bf0: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e  lt:..ver = "unkn
1c00: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  own";..break;.  
1c10: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
1c20: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b  (content_type) {
1c30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1c40: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20  T_HEADER:..type 
1c50: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65  = "Header";..bre
1c60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c70: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45  3_RT_INNER_CONTE
1c80: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d  NT_TYPE:..type =
1c90: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20   "Inner Content 
1ca0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  Type";..break;. 
1cb0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1cc0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50  CHANGE_CIPHER_SP
1cd0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61  EC:..type = "Cha
1ce0: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72  nge Cipher";..br
1cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1d00: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79  L3_RT_ALERT:..ty
1d10: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62  pe = "Alert";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d30: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45  SL3_RT_HANDSHAKE
1d40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73  :..type = "Hands
1d50: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  hake";..break;. 
1d60: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1d70: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41  APPLICATION_DATA
1d80: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44  :..type = "App D
1d90: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ata";..break;.  
1da0: 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f    case DTLS1_RT_
1db0: 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65  HEARTBEAT:..type
1dc0: 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a   = "Heartbeat";.
1dd0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
1de0: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1df0: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e00: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e10: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e20: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e30: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e40: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e50: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e60: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e70: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1e80: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1e90: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ea0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1eb0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ec0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ed0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1ee0: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1ef0: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f00: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f10: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f20: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f  flush(bio);..BIO
1f30: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d  _free(bio);.   }
1f40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1f50: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
1f60: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
1f70: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
1f80: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1f90: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
1fa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1fb0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1fc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1fd0: 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d  Obj("message", -
1fe0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1ff0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2000: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2010: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
2020: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
2030: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
2040: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
2050: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2070: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2090: 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22  write_p ? "Sent"
20a0: 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d   : "Received", -
20b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
20c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
20d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
20e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
20f0: 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20  bj(ver, -1));.  
2100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2120: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65  ewStringObj(type
2140: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2150: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2160: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2170: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2180: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31  ngObj(buffer, -1
2190: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
21a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
21b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
21c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
21d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
21e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
21f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
2200: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2210: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23  unt(cmdPtr);.}.#
2220: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  endif.../*. *---
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c  . *. * VerifyCal
2280: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
2290: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74  onitors SSL cert
22a0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69  ificate validati
22b0: 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64  on process. Used
22c0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a   to control the.
22d0: 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e   *.behavior when
22e0: 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f   the SSL_VERIFY_
22f0: 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74  PEER flag is set
2300: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
2310: 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63  . *.whenever a c
2320: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e  ertificate is in
2330: 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64  spected or decid
2340: 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c  ed invalid. Call
2350: 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63  ed for. *.each c
2360: 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68  ertificate in th
2370: 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a  e cert chain.. *
2380: 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63  . * Checks:. *.c
2390: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e  ertificate chain
23a0: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72   is checked star
23b0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65  ting with the de
23c0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65  epest nesting le
23d0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f  vel. *.  (the ro
23e0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74  ot CA certificat
23f0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70  e) and worked up
2400: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72  ward to the peer
2410: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a  's certificate..
2420: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65   *.All signature
2430: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72  s are valid, cur
2440: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74  rent time is wit
2450: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61  hin first and la
2460: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65  st validity time
2470: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20  .. *.Check that 
2480: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2490: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65  is issued by the
24a0: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63   issuer certific
24b0: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43  ate issuer.. *.C
24c0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74  heck the revocat
24d0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65  ion status for e
24e0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e  ach certificate.
24f0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61  . *.Check the va
2500: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69  lidity of the gi
2510: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20  ven CRL and the 
2520: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20  cert revocation 
2530: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b  status.. *.Check
2540: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66   the policies of
2550: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69   all the certifi
2560: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73  cates. *. * Args
2570: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b  . *.preverify_ok
2580: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68   indicates wheth
2590: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61  er the certifica
25a0: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  te verification 
25b0: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f  passed (1) or no
25c0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75  t (0). *. * Resu
25d0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61  lts:. *.A callba
25e0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ck bound to the 
25f0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72  socket may retur
2600: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20  n one of:. *.   
2610: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   0...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
2630: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76   invalid, send v
2640: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09  erification. *..
2650: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72  ..  failure aler
2660: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74  t to peer, and t
2670: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61  erminate handsha
2680: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d  ke.. *.    1...-
2690: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
26a0: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64   is deemed valid
26b0: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  , continue with 
26c0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20  handshake.. *.  
26d0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d    empty string.-
26e0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65   no change to ce
26f0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
2700: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  tion. *. * Side 
2710: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2720: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2730: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2740: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
2750: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
2760: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
2770: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2780: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2790: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
27e0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43  atic int.VerifyC
27f0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20  allback(int ok, 
2800: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a  X509_STORE_CTX *
2810: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ctx) {.    Tcl_O
2820: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
2830: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53  SSL   *ssl..= (S
2840: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43  SL*)X509_STORE_C
2850: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63  TX_get_ex_data(c
2860: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64  tx, SSL_get_ex_d
2870: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43  ata_X509_STORE_C
2880: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58  TX_idx());.    X
2890: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
28a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
28b0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
28c0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
28d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
28e0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
28f0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c  ta(ssl);.    Tcl
2900: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2910: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2920: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74  rp;.    int dept
2930: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  h..= X509_STORE_
2940: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65  CTX_get_error_de
2950: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e  pth(ctx);.    in
2960: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54  t err..= X509_ST
2970: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f  ORE_CTX_get_erro
2980: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72  r(ctx);..    dpr
2990: 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 64  intf("Verify: %d
29a0: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20  ", ok);..    if 
29b0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
29c0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
29d0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50  L) {..if (stateP
29e0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c  tr->vflags & SSL
29f0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
2a00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
2a10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
2a20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2a30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20  eturn 1;..}.    
2a40: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
2a50: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d  == NULL || ssl =
2a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2a70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
2a80: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
2a90: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
2aa0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2ab0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2ac0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
2ad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2ae0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2af0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2b00: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
2b10: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b40: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2b50: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2b60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2b70: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ba0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2bb0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
2bc0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
2bd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2be0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2bf0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
2c00: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
2c10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2c20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c40: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2c90: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76  bj((char*)X509_v
2ca0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
2cb0: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
2cc0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76  ));..    /* Prev
2cd0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61  ent I/O while ca
2ce0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f  llback is in pro
2cf0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20  gress */.    /* 
2d00: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2d10: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42  |= TLS_TCL_CALLB
2d20: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ACK; */..    /* 
2d30: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2d40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2d50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2d60: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  dPtr);.    ok = 
2d70: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2d80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2da0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2db0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74  Ptr);..    /* st
2dc0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
2dd0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   ~(TLS_TCL_CALLB
2de0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  ACK); */.    ret
2df0: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64  urn(ok);./* By d
2e00: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65  efault, leave ve
2e10: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61  rification uncha
2e20: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a  nged. */.}.../*.
2e30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
2e80: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43  Error --. *. *.C
2e90: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  alls callback wi
2ea0: 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72  th list of error
2eb0: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  s.. *. * Side ef
2ec0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72  fects:. *.The er
2ed0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  r field of the c
2ee0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69  urrently operati
2ef0: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a  ve State is set.
2f00: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67   *.  to a string
2f10: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
2f20: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
2f30: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20  failure reason. 
2f40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
2f90: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65  .Tls_Error(State
2fa0: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72   *statePtr, char
2fb0: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c   *msg) {.    Tcl
2fc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2fd0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2fe0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
2ff0: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74  *cmdPtr, *listPt
3000: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  r;.    unsigned 
3010: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74  long err;.    st
3020: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73  atePtr->err = ms
3030: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
3040: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
3050: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
3060: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
3070: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
3080: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  n;..    /* Creat
3090: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
30a0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
30b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
30c0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
30d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
30e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
30f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3110: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d  ngObj("error", -
3120: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
3130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3140: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3150: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
3160: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
3170: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
3180: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
3190: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d  ;.    if (msg !=
31a0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69   NULL) {..Tcl_Li
31b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
31c0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
31d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
31e0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a  Obj(msg, -1));..
31f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
3200: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  msg = Tcl_GetStr
3210: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3220: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3230: 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 4e  rp), NULL)) != N
3240: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  ULL) {..Tcl_List
3250: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3260: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3270: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3280: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20  j(msg, -1));..  
3290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74    } else {..list
32a0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
32b0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
32c0: 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52  while ((err = ER
32d0: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21  R_get_error()) !
32e0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
32f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3300: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
3310: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
3320: 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f  ingObj(ERR_reaso
3330: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65  n_error_string(e
3340: 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54  rr), -1));..}..T
3350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3360: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3370: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29  cmdPtr, listPtr)
3380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3390: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
33a0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
33b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
33c0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
33d0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
33e0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
33f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
3400: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3410: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3460: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  . * KeyLogCallba
3470: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74  ck --. *. *.Writ
3480: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64  e received key d
3490: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e  ata to log file.
34a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
34b0: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  cts:. *.none. *.
34c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b  -----. */.void K
3510: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f  eyLogCallback(co
3520: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
3530: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20  nst char *line) 
3540: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20  {.    char *str 
3550: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c  = getenv(SSLKEYL
3560: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c  OGFILE);.    FIL
3570: 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69  E *fd;..    dpri
3580: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
3590: 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09      if (str) {..
35a0: 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20  fd = fopen(str, 
35b0: 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66  "a");..fprintf(f
35c0: 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b  d, "%s\n",line);
35d0: 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  ..fclose(fd);.  
35e0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20  . *. * Password 
3640: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
3650: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.Called when a 
3660: 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 70  password for a p
3670: 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 69  rivate key loadi
3680: 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 4d  ng/storing a PEM
3690: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20  . *.certificate 
36a0: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e  with encryption.
36b0: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 20   Evals callback 
36c0: 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72  script and retur
36d0: 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74  ns. *.the result
36e0: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64   as the password
36f0: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a   string in buf..
3700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
3710: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
3720: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
3730: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
3740: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
3750: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73  Returns:. *.Pass
3760: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74  word size in byt
3770: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20  es or -1 for an 
3780: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  error.. *. *----
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
37d0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50   */.static int.P
37e0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
37f0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
3800: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c  ize, int rwflag,
3810: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a   void *udata) {.
3820: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
3830: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
3840: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
3850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
3860: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
3870: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
3880: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
3890: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ode;..    dprint
38a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
38b0: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62    /* If no callb
38c0: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74  ack, use default
38d0: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20   callback */.   
38e0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
38f0: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29  assword == NULL)
3900: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c   {..if (Tcl_Eval
3910: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  Ex(interp, "tls:
3920: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20  :password", -1, 
3930: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3940: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   == TCL_OK) {.. 
3950: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28     char *ret = (
3960: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
3970: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
3980: 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70  rp);..    strncp
3990: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
39a0: 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20  e_t) size);..   
39b0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72   return (int)str
39c0: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73  len(ret);..} els
39d0: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
39e0: 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  -1;..}.    }..  
39f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3a00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
3a10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3a20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3a30: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
3a40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3a50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3a60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3a70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3a80: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29  "password", -1))
3a90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3aa0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3ab0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3ac0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66  cl_NewIntObj(rwf
3ad0: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  lag));.    Tcl_L
3ae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3af0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3b00: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3b10: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54  j(size));..    T
3b20: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3b30: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
3b40: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
3b50: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3b60: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3b70: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3b80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3b90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3ba0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3bb0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3bc0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3bd0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3be0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3bf0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3c00: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3c10: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3c20: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3c30: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3c40: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3c50: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3c60: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3c70: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3c80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3c90: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3ca0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3cb0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3cc0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3cd0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ePtr);..    /* I
3ce0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61  f successful, pa
3cf0: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64  ss back password
3d00: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e   string and trun
3d10: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67  cate if too long
3d20: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65   */.    if (code
3d30: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69   == TCL_OK) {..i
3d40: 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72  nt len;..char *r
3d50: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3d60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3d70: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3d80: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65  ult(interp), &le
3d90: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 73  n);..if (len > s
3da0: 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65  ize-1) {..    le
3db0: 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09  n = size-1;..}..
3dc0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3dd0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
3de0: 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ..buf[len] = '\0
3df0: 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28  ';..Tcl_Release(
3e00: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3e10: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c 65  erp);..return(le
3e20: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  n);.    }.    Tc
3e30: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3e40: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3e50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d      return -1;.}
3e60: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3eb0: 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61  * Session Callba
3ec0: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d  ck for Clients -
3ed0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
3ee0: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  hen a new sessio
3ef0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  n is added to th
3f00: 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20  e cache. In TLS 
3f10: 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20  1.3. *.this may 
3f20: 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74  be received mult
3f30: 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72  iple times after
3f40: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20   the handshake. 
3f50: 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76  For. *.earlier v
3f60: 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69  ersions, this wi
3f70: 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64  ll be received d
3f80: 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68  uring the handsh
3f90: 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20  ake.. *.This is 
3fa0: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61  the preferred wa
3fb0: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65  y to obtain a re
3fc0: 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e  sumable session.
3fd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3fe0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
3ff0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4000: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
4010: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
4020: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
4030: 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72  *.0 = error wher
4040: 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  e session will b
4050: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  e immediately re
4060: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69  moved from the i
4070: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20  nternal cache.. 
4080: 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68  *.1 = success wh
4090: 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20  ere app retains 
40a0: 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69  session in sessi
40b0: 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75  on cache, and mu
40c0: 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53  st call SSL_SESS
40d0: 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20  ION_free() when 
40e0: 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  done.. *. *-----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65  */.static int.Se
4140: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f  ssionCallback(co
4150: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53  nst SSL *ssl, SS
4160: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69  L_SESSION *sessi
4170: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  on) {.    State 
4180: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
4190: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
41a0: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29  data((SSL *)ssl)
41b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
41c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
41d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
41e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
41f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
4200: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
4210: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  t;.    const uns
4220: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
4230: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65  ion_id;.    size
4240: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73  _t len2;.    uns
4250: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a  igned int ulen;.
4260: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4270: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4280: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4290: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
42a0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
42b0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
42c0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  OK;.    } else i
42d0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4310: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
4320: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
4330: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
4340: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
4350: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54  callback);.    T
4360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4380: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
4390: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
43a0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
43b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
43c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
43d0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
43e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
43f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
4400: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
4410: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   -1));..    /* S
4420: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  ession id */.   
4430: 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53   session_id = SS
4440: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64  L_SESSION_get_id
4450: 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
4460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4490: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
44a0: 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  bj(session_id, (
44b0: 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  int) ulen));..  
44c0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
44d0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
44e0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
44f0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
4500: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
4510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4530: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4540: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
4550: 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32  cket, (int) len2
4560: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65  ));..    /* Life
4570: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66  time - number of
4580: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20   seconds */.    
4590: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
45a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
45b0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
45c0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20  wLongObj((long) 
45d0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
45e0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
45f0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
4600: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
4610: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
4620: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
4630: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4640: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
4650: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4660: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
4670: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4680: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
4690: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 0;.}.../*. 
46a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20  ----. *. * ALPN 
46f0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72  Callback for Ser
4700: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c  vers and NPN Cal
4710: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74  lback for Client
4720: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
4730: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74  rm protocol (htt
4740: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65  p/1.1, h2, h3, e
4750: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66  tc.) selection f
4760: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69  or the. *.incomi
4770: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43  ng connection. C
4780: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c  alled after Hell
4790: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c  o and server cal
47a0: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65  lbacks.. *.Where
47b0: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74   'out' is select
47c0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20  ed protocol and 
47d0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72  'in' is the peer
47e0: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74   advertised list
47f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4800: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4810: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4820: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4830: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
4840: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
4850: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4860: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  R_OK: ALPN proto
4870: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
4880: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4890: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
48a0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
48b0: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73  FATAL: There was
48c0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77   no overlap betw
48d0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73  een the client's
48e0: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64  . *.    supplied
48f0: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65   list and the se
4900: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  rver configurati
4910: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
4920: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74  on will be abort
4930: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ed.. *.SSL_TLSEX
4940: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50  T_ERR_NOACK: ALP
4950: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  N protocol not s
4960: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62  elected, e.g., b
4970: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20  ecause no ALPN. 
4980: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20  *.    protocols 
4990: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66  are configured f
49a0: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  or this connecti
49b0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
49c0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
49d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4a20: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61  c int.ALPNCallba
4a30: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
4a40: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
4a50: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
4a60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74  signed char *out
4a70: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len,..const unsi
4a80: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75  gned char *in, u
4a90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65  nsigned int inle
4aa0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
4ab0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4ac0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
4ad0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
4ae0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4af0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4b00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4b10: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
4b20: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e   res;..    dprin
4b30: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
4b40: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
4b50: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
4b60: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4b70: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4b80: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
4b90: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c   Select protocol
4ba0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f   */.    if (SSL_
4bb0: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74  select_next_prot
4bc0: 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73  o(out, outlen, s
4bd0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c  tatePtr->protos,
4be0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4bf0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65  s_len,..in, inle
4c00: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50  n) == OPENSSL_NP
4c10: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a  N_NEGOTIATED) {.
4c20: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20  ./* Match found 
4c30: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4c40: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4c50: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50   } else {../* OP
4c60: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45  ENSSL_NPN_NO_OVE
4c70: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61  RLAP = No overla
4c80: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20  p, so use first 
4c90: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74  item from client
4ca0: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a   protocol list *
4cb0: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  /..res = SSL_TLS
4cc0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4cd0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
4ce0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
4cf0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4d00: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20  {..return res;. 
4d10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4d20: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4d30: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
4d40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
4d50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
4d60: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
4d70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4d80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4d90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4da0: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
4db0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4dc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4dd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4de0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
4df0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
4e00: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
4e10: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
4e20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4e30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4e40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4e50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75  NewStringObj(*ou
4e60: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  t, -1));.    Tcl
4e70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4e80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4e90: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  dPtr, Tcl_NewBoo
4ea0: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53  leanObj(res == S
4eb0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4ec0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
4ed0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
4ee0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
4ef0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
4f00: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
4f10: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
4f20: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4f30: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
4f40: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
4f50: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4f60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
4f70: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f90: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4fa0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
4fb0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4fc0: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  TAL;.    }.    T
4fd0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4fe0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
4ff0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
5000: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5040: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65  -----. *. * Adve
5050: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20  rtise Protocols 
5060: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78  Callback for Nex
5070: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  t Protocol Negot
5080: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20  iation (NPN) in 
5090: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20  ServerHello --. 
50a0: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e  *. *.called when
50b0: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65   a TLS server ne
50c0: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75  eds a list of su
50d0: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c  pported protocol
50e0: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72  s for Next. *.Pr
50f0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
5100: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
5110: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
5120: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5130: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
5140: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
5150: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f  _ERR_OK: NPN pro
5160: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20  tocol selected. 
5170: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5180: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
5190: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
51a0: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  K: NPN protocol 
51b0: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68  not selected. Th
51c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
51d0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  . */.#ifdef USE_
5230: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e  NPN.static int.N
5240: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  PNCallback(const
5250: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
5260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5270: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69  *out, unsigned i
5280: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64  nt *outlen, void
5290: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
52a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
52b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20  State*)arg;..   
52c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
52d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
52e0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
52f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
5300: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5310: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
5320: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f      /* Set proto
5330: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20  cols list */.   
5340: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
5350: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
5360: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74  ..*out = statePt
5370: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74  r->protos;..*out
5380: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  len = statePtr->
5390: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20  protos_len;.    
53a0: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d  } else {..*out =
53b0: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20   NULL;..*outlen 
53c0: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  = 0;..return SSL
53d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
53e0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
53f0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5400: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RR_OK;.}.#endif.
5410: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5460: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f   SNI Callback fo
5470: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a  r Servers --. *.
5480: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65   *.Perform serve
5490: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e  r-side SNI hostn
54a0: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66  ame selection af
54b0: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e  ter receiving SN
54c0: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69  I extension. *.i
54d0: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20  n Client Hello. 
54e0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c  Called after hel
54f0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20  lo callback but 
5500: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c  before ALPN call
5510: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  back.. *. * Resu
5520: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
5530: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5540: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
5550: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
5560: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
5570: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
5580: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f  T_ERR_OK: SNI ho
5590: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74  stname is accept
55a0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
55b0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
55c0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
55d0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49  ALERT_FATAL: SNI
55e0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
55f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
5600: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20  onnection. *.   
5610: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66   is aborted. Def
5620: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69  ault for alert i
5630: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  s SSL_AD_UNRECOG
5640: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53  NIZED_NAME.. *.S
5650: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5660: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49  ERT_WARNING: SNI
5670: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5680: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69   accepted, warni
5690: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20  ng alert. *.    
56a0: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72  sent (not suppor
56b0: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e  ted in TLSv1.3).
56c0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
56d0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
56e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
56f0: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  CK: SNI hostname
5700: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5710: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c   and not acknowl
5720: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e  edged,. *.    e.
5730: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f  g. if SNI has no
5740: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  t been configure
5750: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
5760: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
5770: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
57c0: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b   int.SNICallback
57d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
57e0: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
57f0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
5800: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
5810: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
5820: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5830: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
5840: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
5850: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
5860: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
5870: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
5880: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  name = NULL;..  
5890: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
58a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
58b0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
58c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
58d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
58e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
58f0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72  .    /* Only wor
5900: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61  ks for TLS 1.2 a
5910: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20  nd earlier */.  
5920: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53    servername = S
5930: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
5940: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
5950: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
5960: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76  );.    if (!serv
5970: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72  ername || server
5980: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  name[0] == '\0')
5990: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
59a0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
59b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
59c0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
59d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
59e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
59f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5a00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
5a10: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
5a20: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
5a30: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
5a40: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
5a50: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
5a60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5a70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5a80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5a90: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b  Obj("sni", -1));
5aa0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5ab0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5ac0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
5ad0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5ae0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5af0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5b00: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5b10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5b20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5b30: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5b40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76  ewStringObj(serv
5b50: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a  ername , -1));..
5b60: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
5b70: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
5b80: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5b90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5ba0: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
5bb0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
5bc0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
5bd0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
5be0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5bf0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
5c00: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5c10: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5c20: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
5c30: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
5c40: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20  3 */.    } else 
5c50: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
5c60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5c70: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5c80: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
5c90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5ca0: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65  ERT_FATAL;..*ale
5cb0: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5cc0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5cd0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5ce0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5cf0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5d00: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5d10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5d20: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5d70: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  *. * ClientHello
5d80: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62   Handshake Callb
5d90: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
5da0: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79  --. *. *.Used by
5db0: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69   server to exami
5dc0: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ne the server na
5dd0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
5de0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  NI) extension. *
5df0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65  .provided by the
5e00: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72   client in order
5e10: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70   to select an ap
5e20: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66  propriate certif
5e30: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73  icate to. *.pres
5e40: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74  ent, and make ot
5e50: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
5e60: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65  n adjustments re
5e70: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73  levant to that s
5e80: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e  erver. *.name an
5e90: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74  d its configurat
5ea0: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64  ion. This includ
5eb0: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20  es swapping out 
5ec0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
5ed0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65  *.SSL_CTX pointe
5ee0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  r, modifying the
5ef0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f   server's list o
5f00: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20  f permitted TLS 
5f10: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61  versions,. *.cha
5f20: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  nging the server
5f30: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69  's cipher list i
5f40: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  n response to th
5f50: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65  e client's ciphe
5f60: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09  r list, etc.. *.
5f70: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e  Called before SN
5f80: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62  I and ALPN callb
5f90: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  acks.. *. * Resu
5fa0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
5fb0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5fc0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
5fd0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
5fe0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
5ff0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  es:. *.SSL_CLIEN
6000: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73  T_HELLO_RETRY: s
6010: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73  uspend the hands
6020: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61  hake, and the ha
6030: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e  ndshake function
6040: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d   will return imm
6050: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f  ediately. *.SSL_
6060: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6070: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72  OR: failure, ter
6080: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f  minate connectio
6090: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20  n. Set alert to 
60a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53  error code.. *.S
60b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
60c0: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73  SUCCESS: success
60d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
6120: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61  atic int.HelloCa
6130: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
6140: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
6150: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
6160: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6170: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
6180: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
6190: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
61a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
61b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
61c0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
61d0: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
61e0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
61f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
6200: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
6210: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65    size_t len, re
6220: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70  maining;..    dp
6230: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6240: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
6250: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
6260: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
6270: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6280: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
6290: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
62a0: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c  sl == (const SSL
62b0: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d   *)NULL || arg =
62c0: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20  = (void *)NULL) 
62d0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
62e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
62f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6300: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  Get names */.   
6310: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74   if (!SSL_client
6320: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28  _hello_get0_ext(
6330: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45  ssl, TLSEXT_TYPE
6340: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70  _server_name, &p
6350: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c  , &remaining) ||
6360: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29   remaining <= 2)
6370: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6380: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
6390: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
63a0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
63b0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
63c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
63d0: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
63e0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
63f0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
6400: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
6410: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
6420: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
6430: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
6440: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
6450: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6460: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
6470: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
6480: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6490: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
64a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
64b0: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20  ing = len;..    
64c0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70  /* The list in p
64d0: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73  ractice only has
64e0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
64f0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f  t, so we only co
6500: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74  nsider the first
6510: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20   one. */.    if 
6520: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20  (remaining == 0 
6530: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58  || *p++ != TLSEX
6540: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
6550: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20  name) {..*alert 
6560: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6570: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6580: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6590: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
65a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
65b0: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20  maining--;..    
65c0: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69  /* Now we can fi
65d0: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74  nally pull out t
65e0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69  he byte array wi
65f0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f  th the actual ho
6600: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69  stname. */.    i
6610: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  f (remaining <= 
6620: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
6630: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6640: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6650: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6660: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6670: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
6680: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6690: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
66a0: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
66b0: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20   2 > remaining) 
66c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
66d0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
66e0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
66f0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6700: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6710: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6720: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72  g = len;.    ser
6730: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  vername = (const
6740: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20   char *)p;..    
6750: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
6760: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
6770: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
6780: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
6790: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
67a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
67b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
67c0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
67d0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f  StringObj("hello
67e0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
67f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6800: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6810: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
6820: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
6830: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
6840: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
6850: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
6860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6870: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6880: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6890: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20  Obj(servername, 
68a0: 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20  (int) len));..  
68b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
68c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
68d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
68e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
68f0: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
6900: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
6910: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
6920: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
6930: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6940: 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72  LO_RETRY;..*aler
6950: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6960: 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45  ALERT_USER_CANCE
6970: 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65  LLED;.    } else
6980: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
6990: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49  {..res = SSL_CLI
69a0: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53  ENT_HELLO_SUCCES
69b0: 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  S;.    } else {.
69c0: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e  .res = SSL_CLIEN
69d0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09  T_HELLO_ERROR;..
69e0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
69f0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
6a00: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  NAL_ERROR;.    }
6a10: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
6a20: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
6a30: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
6a40: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d  ********/./* Com
6a60: 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f  mands         */
6a70: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6a80: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 0a 20 2a 0a 20 2a 20 48 61 73 68 20 43 61 6c  -. *. * Hash Cal
6ae0: 63 20 2d 2d 20 72 65 74 75 72 6e 20 68 61 73 68  c -- return hash
6af0: 20 68 65 78 20 73 74 72 69 6e 67 20 66 6f 72 20   hex string for 
6b00: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a 20  message digest. 
6b10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6b20: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
6b30: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
6b40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
6b50: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6ba0: 2f 0a 69 6e 74 0a 48 61 73 68 43 61 6c 63 28 54  /.int.HashCalc(T
6bb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6bc0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
6bd0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
6be0: 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44  [], const EVP_MD
6bf0: 20 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 63 68   *type) {.    ch
6c00: 61 72 20 2a 64 61 74 61 3b 0a 20 20 20 20 69 6e  ar *data;.    in
6c10: 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67  t len;.    unsig
6c20: 6e 65 64 20 69 6e 74 20 6d 64 6c 65 6e 3b 0a 20  ned int mdlen;. 
6c30: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
6c40: 20 6d 64 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d   mdbuf[EVP_MAX_M
6c50: 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73  D_SIZE];.    uns
6c60: 69 67 6e 65 64 20 63 68 61 72 20 68 61 73 68 62  igned char hashb
6c70: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
6c80: 5a 45 2a 32 2b 31 5d 3b 0a 20 20 20 20 63 6f 6e  ZE*2+1];.    con
6c90: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22  st char *hex = "
6ca0: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
6cb0: 22 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  ";..    if (objc
6cc0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
6cd0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6ce0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74  p, 1, objv, "dat
6cf0: 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  a");..return TCL
6d00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6d10: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
6d20: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
6d30: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29  j(objv[1], &len)
6d40: 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61 20 3d  ;.    if (data =
6d50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
6d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6d70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20   }..    /* Calc 
6d80: 68 61 73 68 2c 20 63 6f 6e 76 65 72 74 20 74 6f  hash, convert to
6d90: 20 68 65 78 20 73 74 72 69 6e 67 2c 20 61 6e 64   hex string, and
6da0: 20 77 72 69 74 65 20 74 6f 20 72 65 73 75 6c 74   write to result
6db0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f   */.    if (EVP_
6dc0: 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 73 69  Digest(data, (si
6dd0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 62 75 66  ze_t) len, mdbuf
6de0: 2c 20 26 6d 64 6c 65 6e 2c 20 74 79 70 65 2c 20  , &mdlen, type, 
6df0: 4e 55 4c 4c 29 29 20 7b 0a 09 75 6e 73 69 67 6e  NULL)) {..unsign
6e00: 65 64 20 63 68 61 72 20 2a 6d 70 74 72 20 3d 20  ed char *mptr = 
6e10: 6d 64 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  mdbuf;..unsigned
6e20: 20 63 68 61 72 20 2a 68 70 74 72 20 3d 20 26 68   char *hptr = &h
6e30: 61 73 68 62 75 66 5b 30 5d 3b 0a 0a 09 66 6f 72  ashbuf[0];...for
6e40: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69   (unsigned int i
6e50: 20 3d 20 30 3b 20 69 20 3c 20 6d 64 6c 65 6e 3b   = 0; i < mdlen;
6e60: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 68 70   i++) {..    *hp
6e70: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 2a 6d 70 74  tr++ = hex[(*mpt
6e80: 72 3e 3e 34 29 26 30 78 46 5d 3b 0a 09 20 20 20  r>>4)&0xF];..   
6e90: 20 2a 68 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28   *hptr++ = hex[(
6ea0: 2a 6d 70 74 72 2b 2b 29 26 30 78 46 5d 3b 0a 09  *mptr++)&0xF];..
6eb0: 7d 0a 09 2a 68 70 74 72 20 3d 20 30 3b 0a 09 54  }..*hptr = 0;..T
6ec0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
6ed0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
6ee0: 74 72 69 6e 67 4f 62 6a 28 68 61 73 68 62 75 66  tringObj(hashbuf
6ef0: 2c 20 6d 64 6c 65 6e 2a 32 29 29 3b 0a 20 20 20  , mdlen*2));.   
6f00: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53   } else {..Tcl_S
6f10: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
6f20: 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69   "Hash calculati
6f30: 6f 6e 20 65 72 72 6f 72 22 2c 20 4e 55 4c 4c 29  on error", NULL)
6f40: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6f50: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6f60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
6f70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
6fc0: 48 61 73 68 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d  Hash Commands --
6fd0: 20 52 65 74 75 72 6e 20 68 61 73 68 20 76 61 6c   Return hash val
6fe0: 75 65 20 66 6f 72 20 64 69 67 65 73 74 20 61 73  ue for digest as
6ff0: 20 68 65 78 20 73 74 72 69 6e 67 0a 20 2a 0a 20   hex string. *. 
7000: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
7010: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
7020: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
7030: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
7040: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 48  ----------. */.H
7090: 61 73 68 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ashCmd(ClientDat
70a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
70b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
70c0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
70d0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
70e0: 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ]) {.    int len
70f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
7100: 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73   *name;.    cons
7110: 74 20 45 56 50 5f 4d 44 20 2a 74 79 70 65 3b 0a  t EVP_MD *type;.
7120: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
7130: 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   3) {..Tcl_Wrong
7140: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7150: 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 65 20 64  1, objv, "type d
7160: 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ata");..return T
7170: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7180: 0a 20 20 20 20 6e 61 6d 65 20 3d 20 54 63 6c 5f  .    name = Tcl_
7190: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
71a0: 28 6f 62 6a 76 5b 31 5d 2c 26 6c 65 6e 29 3b 0a  (objv[1],&len);.
71b0: 20 20 20 20 69 66 20 28 6e 61 6d 65 20 3d 3d 20      if (name == 
71c0: 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65 20 3d 20  NULL || (type = 
71d0: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79  EVP_get_digestby
71e0: 6e 61 6d 65 28 6e 61 6d 65 29 29 20 3d 3d 20 4e  name(name)) == N
71f0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
7200: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7210: 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74   "Invalid digest
7220: 20 74 79 70 65 20 5c 22 22 2c 20 6e 61 6d 65 2c   type \"", name,
7230: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72   "\"", NULL);..r
7240: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7250: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 63 2d  .    }.    objc-
7260: 2d 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20  -;.    objv++;. 
7270: 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 61     return HashCa
7280: 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  lc(interp, objc,
7290: 20 6f 62 6a 76 2c 20 74 79 70 65 29 3b 0a 7d 0a   objv, type);.}.
72a0: 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74  ./*. * Command t
72b0: 6f 20 43 61 6c 63 75 6c 61 74 65 20 4d 44 34 20  o Calculate MD4 
72c0: 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73  Hash. */.int.Has
72d0: 68 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61  hMD4Cmd(ClientDa
72e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
72f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7300: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7310: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7320: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
7330: 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70   HashCalc(interp
7340: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56  , objc, objv, EV
7350: 50 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a  P_md4());.}../*.
7360: 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61   * Command to Ca
7370: 6c 63 75 6c 61 74 65 20 4d 44 35 20 48 61 73 68  lculate MD5 Hash
7380: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 4d 44 35  . */.int.HashMD5
7390: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
73a0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
73b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
73c0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
73d0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
73e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73  {.    return Has
73f0: 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62  hCalc(interp, ob
7400: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64  jc, objv, EVP_md
7410: 35 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43  5());.}../*. * C
7420: 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c  ommand to Calcul
7430: 61 74 65 20 53 48 41 2d 31 20 48 61 73 68 0a 20  ate SHA-1 Hash. 
7440: 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48 41 31 43  */.int.HashSHA1C
7450: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
7460: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
7470: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7480: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
7490: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
74a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68  .    return Hash
74b0: 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Calc(interp, obj
74c0: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61  c, objv, EVP_sha
74d0: 31 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43  1());.}../*. * C
74e0: 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 6c  ommand to Calcul
74f0: 61 74 65 20 53 48 41 2d 32 35 36 20 48 61 73 68  ate SHA-256 Hash
7500: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48 41  . */.int.HashSHA
7510: 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  256Cmd(ClientDat
7520: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
7530: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7540: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
7550: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
7560: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
7570: 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c  HashCalc(interp,
7580: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
7590: 5f 73 68 61 32 35 36 28 29 29 3b 0a 7d 0a 0a 2f  _sha256());.}../
75a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61  -------. *. * Ha
75f0: 73 68 20 4c 69 73 74 20 43 6f 6d 6d 61 6e 64 20  sh List Command 
7600: 2d 2d 20 52 65 74 75 72 6e 20 6c 69 73 74 20 6f  -- Return list o
7610: 66 20 68 61 73 68 20 6d 65 73 73 61 67 65 20 64  f hash message d
7620: 69 67 65 73 74 73 0a 20 2a 0a 20 2a 20 52 65 73  igests. *. * Res
7630: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
7640: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
7650: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
7660: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
7670: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 20  -----. */..void 
76c0: 48 61 73 68 4c 69 73 74 43 61 6c 6c 62 61 63 6b  HashListCallback
76d0: 28 63 6f 6e 73 74 20 4f 42 4a 5f 4e 41 4d 45 20  (const OBJ_NAME 
76e0: 2a 6f 62 6a 2c 20 76 6f 69 64 20 2a 61 72 67 29  *obj, void *arg)
76f0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
7700: 6f 62 6a 50 74 72 20 3d 20 28 54 63 6c 5f 4f 62  objPtr = (Tcl_Ob
7710: 6a 20 2a 29 20 61 72 67 3b 0a 20 20 20 20 54 63  j *) arg;.    Tc
7720: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7730: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a  lement(NULL, obj
7740: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
7750: 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c  ngObj(obj->name,
7760: 2d 31 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43  -1));.}../*. * C
7770: 6f 6d 6d 61 6e 64 20 74 6f 20 6c 69 73 74 20 61  ommand to list a
7780: 76 61 69 6c 61 62 6c 65 20 48 61 73 68 20 76 61  vailable Hash va
7790: 6c 75 65 73 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73  lues. */.int.Has
77a0: 68 4c 69 73 74 43 6d 64 28 43 6c 69 65 6e 74 44  hListCmd(ClientD
77b0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
77c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
77d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
77e0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
77f0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
7800: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 54 63 6c  bj *objPtr = Tcl
7810: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
7820: 55 4c 4c 29 3b 0a 0a 20 20 20 20 4f 70 65 6e 53  ULL);..    OpenS
7830: 53 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73  SL_add_all_diges
7840: 74 73 28 29 3b 20 2f 2f 6d 61 6b 65 20 73 75 72  ts(); //make sur
7850: 65 20 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64  e they're loaded
7860: 0a 20 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f  .    OBJ_NAME_do
7870: 5f 61 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59  _all(OBJ_NAME_TY
7880: 50 45 5f 4d 44 5f 4d 45 54 48 2c 20 48 61 73 68  PE_MD_METH, Hash
7890: 4c 69 73 74 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ListCallback, (v
78a0: 6f 69 64 20 2a 29 20 6f 62 6a 50 74 72 29 3b 0a  oid *) objPtr);.
78b0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
78c0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
78d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
78e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
78f0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7900: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
7910: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
7920: 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09  ..objc = objc;..
7930: 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c  objv = objv;.}..
7940: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
7990: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d  CiphersObjCmd --
79a0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
79b0: 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68  ciphers. *. *.Th
79c0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
79d0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
79e0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70  ss the "tls::cip
79f0: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  hers" command. *
7a00: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
7a10: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65  le ciphers, base
7a20: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20  d upon protocol 
7a30: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20  selected.. *. * 
7a40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
7a50: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
7a60: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
7a70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
7a80: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65  onstructs and de
7a90: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65  stroys SSL conte
7aa0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7af0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  -. */.static con
7b00: 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f  st char *protoco
7b10: 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22  ls[] = {.."ssl2"
7b20: 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22  , "ssl3", "tls1"
7b30: 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73  , "tls1.1", "tls
7b40: 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20  1.2", "tls1.3", 
7b50: 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f  NULL.};.enum pro
7b60: 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f  tocol {.    TLS_
7b70: 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20  SSL2, TLS_SSL3, 
7b80: 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c  TLS_TLS1, TLS_TL
7b90: 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32  S1_1, TLS_TLS1_2
7ba0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c  , TLS_TLS1_3, TL
7bb0: 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69  S_NONE.};..stati
7bc0: 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a  c int.CiphersObj
7bd0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
7be0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
7bf0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
7c00: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
7c10: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
7c20: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
7c30: 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  bjPtr = NULL;.  
7c40: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
7c50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a   NULL;.    SSL *
7c60: 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ssl = NULL;.    
7c70: 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50  STACK_OF(SSL_CIP
7c80: 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68  HER) *sk;.    ch
7c90: 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53  ar *cp, buf[BUFS
7ca0: 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64  IZ];.    int ind
7cb0: 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c  ex, verbose = 0,
7cc0: 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d   use_supported =
7cd0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53   0;.    const SS
7ce0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64  L_METHOD *method
7cf0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
7d00: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
7d10: 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c  f ((objc < 2) ||
7d20: 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09   (objc > 4)) {..
7d30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7d40: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7d50: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72  , "protocol ?ver
7d60: 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64  bose? ?supported
7d70: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
7d80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7d90: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
7da0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
7db0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f  , objv[1], proto
7dc0: 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  cols, "protocol"
7dd0: 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20  , 0, &index) != 
7de0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
7df0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7e00: 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63   }.    if ((objc
7e10: 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74   > 2) && Tcl_Get
7e20: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
7e30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
7e40: 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c  &verbose) != TCL
7e50: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
7e60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7e70: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
7e80: 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  3) && Tcl_GetBoo
7e90: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
7ea0: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73  rp, objv[3], &us
7eb0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20  e_supported) != 
7ec0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
7ed0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7ee0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
7ef0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
7f00: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72  switch ((enum pr
7f10: 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a  otocol)index) {.
7f20: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a  .case TLS_SSL2:.
7f30: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
7f40: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
7f50: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66  10100000L || def
7f60: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c  ined(NO_SSL2) ||
7f70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7f80: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54  _NO_SSL2)..    T
7f90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7fa0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7fb0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7fc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7fd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
7fe0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7ff0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
8000: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65  ethod = SSLv2_me
8010: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
8020: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
8030: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65  SSL3:.#if define
8040: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  d(NO_SSL3) || de
8050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8060: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
8070: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
8080: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  3_METHOD)..    T
8090: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
80a0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
80b0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
80c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
80d0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
80e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
80f0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
8100: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
8110: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
8120: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
8130: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
8140: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
8150: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8160: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
8170: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8180: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
8190: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
81a0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
81b0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
81c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
81d0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
81e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
81f0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
8200: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65  ethod = TLSv1_me
8210: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
8220: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
8230: 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69  TLS1_1:.#if defi
8240: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
8250: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
8260: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  L_NO_TLS1_1) || 
8270: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8280: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
8290: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
82a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
82b0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
82c0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
82d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
82e0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
82f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
8300: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
8310: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29  TLSv1_1_method()
8320: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
8330: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32  .case TLS_TLS1_2
8340: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
8350: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
8360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8370: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
8380: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8390: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  1_2_METHOD)..   
83a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
83b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
83c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
83d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
83e0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
83f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8400: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
8410: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f   method = TLSv1_
8420: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
8430: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
8440: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20  TLS_TLS1_3:.#if 
8450: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
8460: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
8470: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
8480: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
8490: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
84a0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
84b0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
84c0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
84d0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
84e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
84f0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54  ..    method = T
8500: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20  LS_method();..  
8510: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69    SSL_CTX_set_mi
8520: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
8530: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
8540: 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ION);..    SSL_C
8550: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
8560: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
8570: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
8580: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69      break;.#endi
8590: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
85a0: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65   method = TLS_me
85b0: 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65  thod();..    bre
85c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
85d0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
85e0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66  (method);.    if
85f0: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ctx == NULL) {
8600: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8610: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f  lt(interp, REASO
8620: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  N(), NULL);..ret
8630: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8640: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20     }..    ssl = 
8650: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20  SSL_new(ctx);.  
8660: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
8670: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
8680: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52  Result(interp, R
8690: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
86a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
86b0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  x);..return TCL_
86c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
86d0: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e    /* Use list an
86e0: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64  d order as would
86f0: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c   be sent in a Cl
8700: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c  ientHello or all
8710: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
8720: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73  rs */.    if (us
8730: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
8740: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75  sk = SSL_get1_su
8750: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28  pported_ciphers(
8760: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
8770: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
8780: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
8790: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b     }..    if (sk
87a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   != NULL) {..if 
87b0: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20  (!verbose) {..  
87c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
87d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
87e0: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e  L);..    for (in
87f0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
8800: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
8810: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
8820: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
8830: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
8840: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
8850: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
8860: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
8870: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28  cipher name or (
8880: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20  NONE) */...cp = 
8890: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e  SSL_CIPHER_get_n
88a0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70  ame(c);...if (cp
88b0: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b   == NULL) break;
88c0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
88d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
88e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
88f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c  NewStringObj(cp,
8900: 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09   -1));..    }...
8910: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62  } else {..    ob
8920: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
8930: 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09  ringObj("",0);..
8940: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
8950: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
8960: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
8970: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
8980: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
8990: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
89a0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
89b0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
89c0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75  nue;..../* textu
89d0: 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  al description o
89e0: 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  f the cipher */.
89f0: 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52  ..if (SSL_CIPHER
8a00: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20  _description(c, 
8a10: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
8a20: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20  ) != NULL) {... 
8a30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f     Tcl_AppendToO
8a40: 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20  bj(objPtr, buf, 
8a50: 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65  (Tcl_Size) strle
8a60: 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73  n(buf));...} els
8a70: 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70  e {...    Tcl_Ap
8a80: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72  pendToObj(objPtr
8a90: 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38  , "UNKNOWN\n", 8
8aa0: 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d  );...}..    }..}
8ab0: 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72  ..if (use_suppor
8ac0: 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53  ted) {..    sk_S
8ad0: 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73  SL_CIPHER_free(s
8ae0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  k);..}.    }.   
8af0: 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a   SSL_free(ssl);.
8b00: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
8b10: 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  (ctx);..    Tcl_
8b20: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
8b30: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
8b40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8b50: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
8b60: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
8b70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72  -------. *. * Pr
8bc0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d  otocolsObjCmd --
8bd0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
8be0: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09  protocols. *. *.
8bf0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
8c00: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
8c10: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70  cess the "tls::p
8c20: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e  rotocols" comman
8c30: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
8c40: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
8c50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
8c60: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
8c70: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
8c80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8c90: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
8ca0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ce0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
8cf0: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  int.ProtocolsObj
8d00: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
8d10: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8d20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8d30: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
8d40: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
8d50: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
8d60: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69  bjPtr;..    dpri
8d70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
8d80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
8d90: 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  1) {..Tcl_WrongN
8da0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8db0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65  , objv, "");..re
8dc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8dd0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
8de0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
8df0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
8e00: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
8e10: 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53  LL);..#if OPENSS
8e20: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
8e30: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
8e40: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
8e50: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
8e60: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
8e70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
8e80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8e90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
8ea0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
8eb0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c  rotocols[TLS_SSL
8ec0: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  2], -1));.#endif
8ed0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8ee0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
8ef0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
8f00: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
8f10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f  OPENSSL_NO_SSL3_
8f20: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8f30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8f40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8f50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8f60: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8f70: 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b  TLS_SSL3], -1));
8f80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8f90: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
8fa0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8fb0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  L_NO_TLS1) && !d
8fc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8fd0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20  O_TLS1_METHOD). 
8fe0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8ff0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
9000: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
9010: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
9020: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d  tocols[TLS_TLS1]
9030: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
9040: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
9050: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
9060: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9070: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
9080: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
9090: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
90a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
90b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
90c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
90d0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
90e0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c  ols[TLS_TLS1_1],
90f0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
9100: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
9110: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
9120: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
9130: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
9140: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9150: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  _2_METHOD).    T
9160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
9170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
9180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
9190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
91a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20  ls[TLS_TLS1_2], 
91b0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
91c0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
91d0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
91e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
91f0: 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  _3).    Tcl_List
9200: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
9210: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
9220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
9230: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
9240: 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_3], -1));.#
9250: 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53  endif..    Tcl_S
9260: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
9270: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
9280: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9290: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
92a0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
92b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e  ------. *. * Han
9300: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a  dshakeObjCmd --.
9310: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61   *. *.This comma
9320: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  nd is used to ve
9330: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65  rify whether the
9340: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f   handshake is co
9350: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74  mplete. *.or not
9360: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
9370: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
9380: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61  cl result. 1 mea
9390: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d  ns handshake com
93a0: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70  plete, 0 means p
93b0: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69  ending.. *. * Si
93c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
93d0: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67  ay force SSL neg
93e0: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65  otiation to take
93f0: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d   place.. *. *---
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
9450: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28  HandshakeObjCmd(
9460: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
9470: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
9480: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
9490: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
94a0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
94b0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
94c0: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an;        /* Th
94d0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
94e0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
94f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
9500: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c  tr;        /* cl
9510: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
9520: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
9530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72   const char *err
9540: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Str = NULL;.    
9550: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20  int ret = 1;.   
9560: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20   int err = 0;.. 
9570: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
9580: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
9590: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
95a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
95b0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
95c0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
95d0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
95e0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
95f0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
9600: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9610: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
9620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9630: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
9640: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
9650: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
9660: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
9670: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  {..return(TCL_ER
9680: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
9690: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
96a0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
96b0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
96c0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
96d0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
96e0: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
96f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
9700: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
9710: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
9720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
9730: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
9740: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
9750: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
9760: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
9770: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
9780: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
9790: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
97a0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e  erp, "TLS", "HAN
97b0: 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45  DSHAKE", "CHANNE
97c0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
97d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
97e0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
97f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
9800: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
9810: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
9820: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
9830: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
9840: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69  "Calling Tls_Wai
9850: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20  tForConnect");. 
9860: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69     ret = Tls_Wai
9870: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
9880: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a  ePtr, &err, 1);.
9890: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
98a0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
98b0: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72  returned: %i", r
98c0: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  et);..    if (re
98d0: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65  t < 0 && ((state
98e0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
98f0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28  _TCL_ASYNC) && (
9900: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29  err == EAGAIN)))
9910: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79   {..dprintf("Asy
9920: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d  nc set and err =
9930: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20   EAGAIN");..ret 
9940: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  = 0;.    } else 
9950: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
9960: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72  long result;..er
9970: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
9980: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
9990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
99a0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
99b0: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
99c0: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d  r || (*errStr ==
99d0: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53   0)) {..    errS
99e0: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72  tr = Tcl_PosixEr
99f0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ror(interp);..}.
9a00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
9a10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
9a20: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
9a30: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a   errStr, (char *
9a40: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72  ) NULL);..if ((r
9a50: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f  esult = SSL_get_
9a60: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
9a70: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d  atePtr->ssl)) !=
9a80: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20   X509_V_OK) {.. 
9a90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9aa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75  ult(interp, " du
9ab0: 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65  e to: ", X509_ve
9ac0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
9ad0: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20  string(result), 
9ae0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
9af0: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  .}..Tcl_SetError
9b00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
9b10: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
9b20: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
9b30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69   *) NULL);..dpri
9b40: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
9b50: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61  CL_ERROR with ha
9b60: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
9b70: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72  %s", errStr);..r
9b80: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
9b90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
9ba0: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a  if (err != 0) {.
9bb0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
9bc0: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20  t an error with 
9bd0: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64  a completed hand
9be0: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22  shake: err = %i"
9bf0: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20  , err);..}..ret 
9c00: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
9c10: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
9c20: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64  ng TCL_OK with d
9c30: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74  ata \"%i\"", ret
9c40: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
9c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
9c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
9c70: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  t));.    return(
9c80: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74  TCL_OK);..client
9c90: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
9ca0: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  a;.}../*. *-----
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9cf0: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
9d00: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
9d10: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
9d20: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
9d30: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
9d40: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
9d50: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
9d60: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
9d70: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
9d80: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
9d90: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
9da0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
9db0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
9dc0: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
9dd0: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
9de0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
9df0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
9e40: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
9e50: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
9e60: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
9e70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9e80: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
9e90: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
9ea0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
9eb0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
9ec0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
9ed0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
9ee0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
9ef0: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
9f00: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
9f10: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
9f20: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20  TX *ctx.        
9f30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9f40: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20  Obj *script.    
9f50: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9f60: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72  Tcl_Obj *passwor
9f70: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
9f80: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  ;.    Tcl_Obj *v
9f90: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  cmd.        = NU
9fa0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
9fb0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
9fc0: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
9fd0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9fe0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9ff0: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
a000: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
a010: 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a    int idx, len;.
a020: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20      int flags.. 
a030: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c         = TLS_TCL
a040: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
a050: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d  erver..        =
a060: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
a070: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
a080: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
a090: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09    char *keyfile.
a0a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a0b0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
a0c0: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
a0d0: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
a0e0: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55  char *key  .= NU
a0f0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  LL;.    int key_
a100: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
a110: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73      = 0;.    uns
a120: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
a130: 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b           = NULL;
a140: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65  .    int cert_le
a150: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
a160: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
a170: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
a180: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
a190: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
a1a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a1b0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
a1c0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a1d0: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
a1e0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a1f0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
a200: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
a210: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
a220: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
a230: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
a240: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
a250: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
a260: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
a270: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
a280: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
a290: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
a2a0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
a2b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70      Tcl_Obj *alp
a2c0: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  n..= NULL;.    i
a2d0: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
a2e0: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
a2f0: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
a300: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
a310: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
a320: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
a330: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
a340: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
a350: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
a360: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
a370: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20  andshake = 0;.. 
a380: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
a390: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
a3a0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
a3b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
a3c0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31  O_TLS1).    tls1
a3d0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
a3e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
a3f0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
a400: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
a410: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30  ).    tls1_1 = 0
a420: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
a430: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
a440: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
a450: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
a460: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65    tls1_2 = 0;.#e
a470: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
a480: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
a490: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
a4a0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c  O_TLS1_3).    tl
a4b0: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_3 = 0;.#endif
a4c0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
a4d0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
a4e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a4f0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
a500: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09  l ?options?");..
a510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a520: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
a530: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
a540: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
a550: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
a560: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
a570: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
a580: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
a590: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
a5a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
a5b0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
a5c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
a5d0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
a5e0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
a5f0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
a600: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
a610: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
a620: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f  l(chan);..    fo
a630: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20  r (idx = 2; idx 
a640: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
a650: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
a660: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a670: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55  bj(objv[idx], NU
a680: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  LL);...if (opt[0
a690: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
a6a0: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22  reak;...OPTOBJ("
a6b0: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09  -alpn", alpn);..
a6c0: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c  OPTSTR("-cadir",
a6d0: 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52   CAdir);..OPTSTR
a6e0: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69  ("-cafile", CAfi
a6f0: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  le);..OPTBYTE("-
a700: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72  cert", cert, cer
a710: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  t_len);..OPTSTR(
a720: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
a730: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  tfile);..OPTSTR(
a740: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65  "-cipher", ciphe
a750: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
a760: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73  iphers", ciphers
a770: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
a780: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68  hersuites", ciph
a790: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f  ersuites);..OPTO
a7a0: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  BJ("-command", s
a7b0: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
a7c0: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70  "-dhparams", DHp
a7d0: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45  arams);..OPTBYTE
a7e0: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65  ("-key", key, ke
a7f0: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  y_len);..OPTSTR(
a800: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66  "-keyfile", keyf
a810: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ile);..OPTSTR("-
a820: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a  model", model);.
a830: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f  .OPTOBJ("-passwo
a840: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a  rd", password);.
a850: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f  .OPTBOOL("-post_
a860: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74  handshake", post
a870: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50  _handshake);..OP
a880: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22  TBOOL("-request"
a890: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54  , request);..OPT
a8a0: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c  BOOL("-require",
a8b0: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49   require);..OPTI
a8c0: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76  NT("-securitylev
a8d0: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50  el", level);..OP
a8e0: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c  TBOOL("-server",
a8f0: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54   server);..OPTST
a900: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c  R("-servername",
a910: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f   servername);..O
a920: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f  PTSTR("-session_
a930: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29  id", session_id)
a940: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
a950: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42  2", ssl2);..OPTB
a960: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c  OOL("-ssl3", ssl
a970: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  3);..OPTBOOL("-t
a980: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50  ls1", tls1);..OP
a990: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c  TBOOL("-tls1.1",
a9a0: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f   tls1_1);..OPTBO
a9b0: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c  OL("-tls1.2", tl
a9c0: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_2);..OPTBOOL(
a9d0: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f  "-tls1.3", tls1_
a9e0: 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61  3);..OPTOBJ("-va
a9f0: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20  lidatecommand", 
aa00: 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  vcmd);..OPTOBJ("
aa10: 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a  -vcmd", vcmd);..
aa20: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22  .OPTBAD("option"
aa30: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72  , "-alpn, -cadir
aa40: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74  , -cafile, -cert
aa50: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
aa60: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69  pher, -ciphersui
aa70: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  tes, -command, -
aa80: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
aa90: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
aaa0: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f  , -password, -po
aab0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72  st_handshake, -r
aac0: 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65  equest, -require
aad0: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c  , -securitylevel
aae0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76  , -server, -serv
aaf0: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e  ername, -session
ab00: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c  _id, -ssl2, -ssl
ab10: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e  3, -tls1, -tls1.
ab20: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73  1, -tls1.2, -tls
ab30: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74  1.3, or -validat
ab40: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65  ecommand");...re
ab50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab60: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65      }.    if (re
ab70: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c  quest)..verify |
ab80: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  = SSL_VERIFY_CLI
ab90: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56  ENT_ONCE | SSL_V
aba0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20  ERIFY_PEER;.    
abb0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72  if (request && r
abc0: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c  equire).verify |
abd0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  = SSL_VERIFY_FAI
abe0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
abf0: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  T;.    if (reque
ac00: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
ac10: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20  hake).verify |= 
ac20: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f  SSL_VERIFY_POST_
ac30: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69  HANDSHAKE;.    i
ac40: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09  f (verify == 0).
ac50: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
ac60: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
ac70: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
ac80: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
ac90: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
aca0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
acb0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
acc0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
acd0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
ace0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
acf0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
ad00: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
ad10: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
ad20: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
ad30: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
ad40: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
ad50: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
ad60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
ad70: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
ad80: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
ad90: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
ada0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
adb0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
adc0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
add0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
ade0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
adf0: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
ae00: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
ae10: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
ae20: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
ae30: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
ae40: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
ae50: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
ae60: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
ae70: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
ae80: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
ae90: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
aea0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
aeb0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
aec0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
aed0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
aee0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
aef0: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
af00: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
af10: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
af20: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
af30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
af40: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72  CAdir && !*CAdir
af50: 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09  ).        CAdir.
af60: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
af70: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
af80: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
af90: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
afa0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
afb0: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
afc0: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
afd0: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
afe0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
aff0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
b000: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
b010: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
b020: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
b030: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
b040: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
b050: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
b060: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
b070: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
b080: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
b090: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
b0a0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
b0b0: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
b0c0: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
b0d0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
b0e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
b0f0: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
b100: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
b110: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
b120: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
b130: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
b140: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
b150: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
b160: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
b170: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
b180: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
b190: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
b1a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
b1b0: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
b1c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
b1d0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
b1e0: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
b1f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b200: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
b210: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
b220: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
b230: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
b240: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
b250: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
b260: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
b270: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
b280: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
b290: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
b2a0: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
b2b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
b2c0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
b2d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
b2e0: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
b2f0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
b300: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
b310: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
b320: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
b330: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
b340: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
b350: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
b360: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
b370: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
b380: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
b390: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b3a0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
b3b0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
b3c0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
b3d0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
b3e0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
b3f0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
b400: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
b410: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
b420: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
b430: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
b440: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b450: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
b460: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
b470: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
b480: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
b490: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
b4a0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b4b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b4c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b4d0: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  T", "CHANNEL", "
b4e0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
b4f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b500: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b510: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b530: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
b540: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
b550: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
b560: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
b570: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
b580: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
b590: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65  (statePtr, serve
b5a0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c  r, proto, keyfil
b5b0: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79  e, certfile, key
b5c0: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c  , cert, key_len,
b5d0: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20  ..    cert_len, 
b5e0: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63  CAdir, CAfile, c
b5f0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75  iphers, ciphersu
b600: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70  ites, level, DHp
b610: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29  arams)) == NULL)
b620: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
b630: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
b640: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
b660: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
b670: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a  tr->ctx = ctx;..
b680: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
b690: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
b6a0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  re that the chan
b6b0: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e  nel works in bin
b6c0: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20  ary (for the.   
b6d0: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e    * encryption n
b6e0: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64  ot to get goofed
b6f0: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20   up)..     * We 
b700: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a  only want to adj
b710: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e  ust the bufferin
b720: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e  g in pre-v2 chan
b730: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20  nels, where.    
b740: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20   * each channel 
b750: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69  in the stack mai
b760: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20  ntained its own 
b770: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f  buffers..     */
b780: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
b790: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
b7a0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
b7b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
b7c0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
b7d0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
b7e0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
b7f0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
b800: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
b810: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
b820: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
b830: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
b840: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b850: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63  rp, chan, "-eofc
b860: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e  har", &upperChan
b870: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
b880: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
b890: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
b8a0: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  an, "-encoding",
b8b0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e   &upperChannelEn
b8c0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
b8d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
b8e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
b8f0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
b900: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
b910: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
b920: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
b930: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
b940: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26  , "-blocking", &
b950: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
b960: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53  king);.    Tcl_S
b970: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
b980: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
b990: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
b9a0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
b9b0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
b9c0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
b9d0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72  "-blocking", "tr
b9e0: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ue");.    dprint
b9f0: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c  f("Consuming Tcl
ba00: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63   channel %s", Tc
ba10: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
ba20: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61  (chan));.    sta
ba30: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
ba40: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
ba50: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e  nterp, Tls_Chann
ba60: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e  elType(), (Clien
ba70: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
ba80: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
ba90: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
baa0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
bab0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
bac0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
bad0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
bae0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
baf0: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
bb00: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
bb10: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
bb20: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
bb30: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
bb40: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
bb50: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
bb60: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
bb70: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20  .Tls_Free((char 
bb80: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72  *) statePtr);..r
bb90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bba0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
bbb0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
bbc0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
bbd0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
bbe0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
bbf0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
bc00: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
bc10: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
bc20: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
bc30: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
bc40: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
bc50: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
bc60: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
bc70: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
bc80: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
bc90: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
bca0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
bcb0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
bcc0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
bcd0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
bce0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
bcf0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
bd00: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
bd10: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
bd20: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
bd30: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
bd40: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20  Blocking));..   
bd50: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49   /*.     * SSL I
bd60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
bd70: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50     */.    stateP
bd80: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
bd90: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
bda0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
bdb0: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
bdc0: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
bdd0: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
bde0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
bdf0: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
be00: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
be10: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
be20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
be30: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
be40: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
be50: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49  , "IMPORT", "INI
be60: 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  T", "FAILED", (c
be70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  har *) NULL);..T
be80: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
be90: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74   statePtr);..ret
bea0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
beb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
bec0: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d   host server nam
bed0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72  e */.    if (ser
bee0: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53  vername) {../* S
bef0: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e  ets the server n
bf00: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
bf10: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65  SNI) in ClientHe
bf20: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
bf30: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36  ../* Per RFC 606
bf40: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  6, hostname is a
bf50: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73   ASCII encoded s
bf60: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46  tring, though RF
bf70: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d  C 4366 says UTF-
bf80: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  8. */..if (!SSL_
bf90: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
bfa0: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
bfb0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
bfc0: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
bfd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
bfe0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
bff0: 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61  ting TLS host na
c000: 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  me extension fai
c010: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  led", (char *) N
c020: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
c030: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
c040: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
c050: 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49  RT", "SNI", "FAI
c060: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
c070: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
c080: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
c090: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
c0a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
c0b0: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e  }.../* Set hostn
c0c0: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72  ame for peer cer
c0d0: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d  tificate hostnam
c0e0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69  e verification i
c0f0: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44  n clients...   D
c100: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74  on't use SSL_set
c110: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20  1_host since it 
c120: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e  has limitations.
c130: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64   */..if (!SSL_ad
c140: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72  d1_host(statePtr
c150: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
c160: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  e)) {..    Tcl_A
c170: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c180: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53  rp, "setting DNS
c190: 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65   host name faile
c1a0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
c1b0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
c1c0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
c1d0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
c1e0: 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22  ", "HOSTNAME", "
c1f0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
c200: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
c210: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
c220: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
c230: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c240: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
c250: 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f  /* Resume sessio
c260: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  n id */.    if (
c270: 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74  session_id && st
c280: 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29  rlen(session_id)
c290: 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f   <= SSL_MAX_SID_
c2a0: 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f  CTX_LENGTH) {../
c2b0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f  * SSL_set_sessio
c2c0: 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  n() */..if (!SSL
c2d0: 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64  _SESSION_set1_id
c2e0: 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74  _context(SSL_get
c2f0: 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74  _session(statePt
c300: 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e  r->ssl), session
c310: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  _id, (unsigned i
c320: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69  nt) strlen(sessi
c330: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20  on_id))) {..    
c340: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c350: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65  (interp, "Resume
c360: 20 73 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73   session id ", s
c370: 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69  ession_id, " fai
c380: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  led", (char *) N
c390: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
c3a0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
c3b0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
c3c0: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20  RT", "SESSION", 
c3d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
c3e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
c3f0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
c400: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
c410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c420: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
c430: 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69   /* Enable Appli
c440: 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f  cation-Layer Pro
c450: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f  tocol Negotiatio
c460: 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a  n. Examples are:
c470: 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70   http/1.0,..http
c480: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74  /1.1, h2, h3, ft
c490: 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78  p, imap, pop3, x
c4a0: 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70  mpp-client, xmpp
c4b0: 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69  -server, mqtt, i
c4c0: 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20  rc, etc. */.    
c4d0: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20  if (alpn) {../* 
c4e0: 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69  Convert a TCL li
c4f0: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63  st into a protoc
c500: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d  ol-list in wire-
c510: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67  format */..unsig
c520: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73  ned char *protos
c530: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , *p;..unsigned 
c540: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  int protos_len =
c550: 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c   0;..int i, len,
c560: 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a   cnt;..Tcl_Obj *
c570: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c  *list;...if (Tcl
c580: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
c590: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e  nts(interp, alpn
c5a0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21  , &cnt, &list) !
c5b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
c5c0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
c5d0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
c5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c5f0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ROR;..}.../* Det
c600: 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72  ermine the memor
c610: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  y required for t
c620: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  he protocol-list
c630: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b   */..for (i = 0;
c640: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b   i < cnt; i++) {
c650: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72  ..    Tcl_GetStr
c660: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b  ingFromObj(list[
c670: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20  i], &len);..    
c680: 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b  if (len > 255) {
c690: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
c6a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50  ult(interp, "ALP
c6b0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20  N protocol name 
c6c0: 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72  too long", (char
c6d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c   *) NULL);...Tcl
c6e0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
c6f0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
c700: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22  PORT", "ALPN", "
c710: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
c720: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46  ) NULL);...Tls_F
c730: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
c740: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
c750: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
c760: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
c770: 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09  en += 1 + len;..
c780: 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65  }.../* Build the
c790: 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63   complete protoc
c7a0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74  ol-list */..prot
c7b0: 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f  os = ckalloc(pro
c7c0: 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72  tos_len);../* pr
c7d0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e  otocol-lists con
c7e0: 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65  sist of 8-bit le
c7f0: 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62  ngth-prefixed, b
c800: 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09  yte strings */..
c810: 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20  for (i = 0, p = 
c820: 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b  protos; i < cnt;
c830: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61   i++) {..    cha
c840: 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74  r *str = Tcl_Get
c850: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
c860: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
c870: 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09     *p++ = len;..
c880: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74      memcpy(p, st
c890: 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20  r, len);..    p 
c8a0: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  += len;..}.../* 
c8b0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
c8c0: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79  tos makes a copy
c8d0: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c   of the protocol
c8e0: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74  -list */../* Not
c8f0: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e: This function
c900: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72  s reverses the r
c910: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76  eturn value conv
c920: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53  ention */..if (S
c930: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
c940: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  os(statePtr->ssl
c950: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73  , protos, protos
c960: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63  _len)) {..    Tc
c970: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c980: 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74  nterp, "failed t
c990: 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f  o set ALPN proto
c9a0: 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20  cols", (char *) 
c9b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
c9c0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
c9d0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
c9e0: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
c9f0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
ca00: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
ca10: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
ca20: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
ca30: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
ca40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ca50: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74  RROR;..}.../* St
ca60: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  ore protocols li
ca70: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  st */..statePtr-
ca80: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73  >protos = protos
ca90: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
caa0: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73  tos_len = protos
cab0: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
cac0: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72   {..statePtr->pr
cad0: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74  otos = NULL;..st
cae0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
caf0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  en = 0;.    }.. 
cb00: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
cb10: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20   Callbacks.     
cb20: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61  */.    SSL_set_a
cb30: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72  pp_data(statePtr
cb40: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
cb50: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69  tatePtr);./* poi
cb60: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f  nt back to us */
cb70: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72  .    SSL_set_ver
cb80: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ify(statePtr->ss
cb90: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66  l, verify, Verif
cba0: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
cbb0: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c  SSL_set_info_cal
cbc0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
cbd0: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63  ssl, InfoCallbac
cbe0: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  k);..    /* Call
cbf0: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69  back for observi
cc00: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73  ng protocol mess
cc10: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ages */.#ifndef 
cc20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
cc30: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64  RACE.    /* void
cc40: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
cc50: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
cc60: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f  atePtr->ctx, (vo
cc70: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
cc80: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58      void SSL_CTX
cc90: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
cca0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  k(statePtr->ctx,
ccb0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
ccc0: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  ); */.    SSL_se
ccd0: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
cce0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  rg(statePtr->ssl
ccf0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
cd00: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  tr);.    SSL_set
cd10: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74  _msg_callback(st
cd20: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73  atePtr->ssl, Mes
cd30: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23  sageCallback);.#
cd40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72  endif..    /* Cr
cd50: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  eate Tcl_Channel
cd60: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a   BIO Handler */.
cd70: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f      statePtr->p_
cd80: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63  bio.= BIO_new_tc
cd90: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f  l(statePtr, BIO_
cda0: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74  NOCLOSE);.    st
cdb0: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49  atePtr->bio.= BI
cdc0: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28  O_new(BIO_f_ssl(
cdd0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72  ));..    if (ser
cde0: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65  ver) {../* Serve
cdf0: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09  r callbacks */..
ce00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
ce10: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72  xt_servername_ar
ce20: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
ce30: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
ce40: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  r);..SSL_CTX_set
ce50: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
ce60: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  me_callback(stat
ce70: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61  ePtr->ctx, SNICa
ce80: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54  llback);..SSL_CT
ce90: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c  X_set_client_hel
cea0: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  lo_cb(statePtr->
ceb0: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61  ctx, HelloCallba
cec0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
ced0: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74  ePtr);..if (stat
cee0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
cef0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
cf00: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65  _CTX_set_alpn_se
cf10: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
cf20: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
cf30: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
cf40: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55  tePtr);.#ifdef U
cf50: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28  SE_NPN..    if (
cf60: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
cf70: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09  ls1_3 == 0) {...
cf80: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
cf90: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73  _protos_advertis
cfa0: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ed_cb(statePtr->
cfb0: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b  ctx, NPNCallback
cfc0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
cfd0: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64  tr);..    }.#end
cfe0: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c  if..}.../* Enabl
cff0: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64  e server to send
d000: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66   cert request af
d010: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54  ter handshake (T
d020: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a  LS 1.3 only) */.
d030: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72  ./* A write oper
d040: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20  ation must take 
d050: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65  place for the Ce
d060: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73  rtificate Reques
d070: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74  t to be..   sent
d080: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20   to the client, 
d090: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65  this can be done
d0a0: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e   with SSL_do_han
d0b0: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66  dshake(). */..if
d0c0: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
d0d0: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74  t_handshake && t
d0e0: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53  ls1_3) {..    SS
d0f0: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f  L_verify_client_
d100: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73  post_handshake(s
d110: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
d120: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d  }.../* set autom
d130: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63  atic curve selec
d140: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74  tion */..SSL_set
d150: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65  _ecdh_auto(state
d160: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09  Ptr->ssl, 1);...
d170: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f  /* Set server mo
d180: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  de */..statePtr-
d190: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
d1a0: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73  L_SERVER;..SSL_s
d1b0: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28  et_accept_state(
d1c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
d1d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
d1e0: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b   Client callback
d1f0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  s */.#ifdef USE_
d200: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74  NPN..if (statePt
d210: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
d220: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30  L && tls1_2 == 0
d230: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
d240: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
d250: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73  set_next_proto_s
d260: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74  elect_cb(statePt
d270: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c  r->ctx, ALPNCall
d280: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
d290: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64  atePtr);..}.#end
d2a0: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  if.../* Session 
d2b0: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f  caching */..SSL_
d2c0: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f  CTX_set_session_
d2d0: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65  cache_mode(state
d2e0: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45  Ptr->ctx, SSL_SE
d2f0: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20  SS_CACHE_CLIENT 
d300: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  | SSL_SESS_CACHE
d310: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f  _NO_INTERNAL_STO
d320: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  RE);..SSL_CTX_se
d330: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74  ss_set_new_cb(st
d340: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73  atePtr->ctx, Ses
d350: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  sionCallback);..
d360: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20  ./* Enable post 
d370: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e  handshake Authen
d380: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69  tication extensi
d390: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  on. TLS 1.3 only
d3a0: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f  , not http/2. */
d3b0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
d3c0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
d3d0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f   {..    SSL_set_
d3e0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61  post_handshake_a
d3f0: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uth(statePtr->ss
d400: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  l, 1);..}.../* S
d410: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a  et client mode *
d420: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65  /..SSL_set_conne
d430: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  ct_state(statePt
d440: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
d450: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73     SSL_set_bio(s
d460: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74  tatePtr->ssl, st
d470: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73  atePtr->p_bio, s
d480: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b  tatePtr->p_bio);
d490: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c  .    BIO_set_ssl
d4a0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
d4b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42  statePtr->ssl, B
d4c0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20  IO_NOCLOSE);..  
d4d0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20    /*.     * End 
d4e0: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20  of SSL Init.    
d4f0: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28   */.    dprintf(
d500: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20  "Returning %s", 
d510: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
d520: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
d530: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  f));.    Tcl_Set
d540: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
d550: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43  char *) Tcl_GetC
d560: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
d570: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f  Ptr->self), TCL_
d580: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20  VOLATILE);..    
d590: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
d5a0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
d5b0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
d5c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d600: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d  -----. *. * Unim
d610: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
d620: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
d630: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
d640: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d   remove the topm
d650: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74  ost channel filt
d660: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
d670: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
d680: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
d690: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
d6a0: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74  . *.May modify t
d6b0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61  he behavior of a
d6c0: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  n IO channel.. *
d6d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d710: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
d720: 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62  c int.UnimportOb
d730: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
d740: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
d750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
d760: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
d770: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
d780: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
d790: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
d7a0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
d7b0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20  a mode on. */.. 
d7c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
d7d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
d7e0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
d7f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d800: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
d810: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
d820: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d830: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
d840: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
d850: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
d860: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
d870: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
d880: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
d890: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
d8a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d8b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
d8c0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
d8d0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
d8e0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
d8f0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
d900: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
d910: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
d920: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
d930: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
d940: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
d950: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d960: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
d970: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
d980: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
d990: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
d9a0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
d9b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
d9c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
d9d0: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54  "TLS", "UNIMPORT
d9e0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
d9f0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
da00: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
da10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
da20: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  }..    if (Tcl_U
da30: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
da40: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
da50: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74  CL_ERROR) {..ret
da60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
da70: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
da80: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
da90: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
daa0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
dab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
daf0: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d   *. * CTX_Init -
db00: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53  - construct a SS
db10: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20  L_CTX instance. 
db20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
db30: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58  .A valid SSL_CTX
db40: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c   instance or NUL
db50: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  L.. *. * Side ef
db60: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
db70: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74  ucts SSL context
db80: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d   (CTX). *. *----
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
dbd0: 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43   */.static SSL_C
dbe0: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74  TX *.CTX_Init(St
dbf0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69  ate *statePtr, i
dc00: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74  nt isServer, int
dc10: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65   proto, char *ke
dc20: 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72  yfile, char *cer
dc30: 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67  tfile,.    unsig
dc40: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75  ned char *key, u
dc50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
dc60: 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c  rt, int key_len,
dc70: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63   int cert_len, c
dc80: 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20  har *CAdir,.    
dc90: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68  char *CAfile, ch
dca0: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61  ar *ciphers, cha
dcb0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c  r *ciphersuites,
dcc0: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72   int level, char
dcd0: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20   *DHparams) {.  
dce0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dcf0: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d  terp = statePtr-
dd00: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c  >interp;.    SSL
dd10: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
dd20: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
dd30: 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53  g ds;.    Tcl_DS
dd40: 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69  tring ds1;.    i
dd50: 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nt off = 0;.    
dd60: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65  int load_private
dd70: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  _key;.    const 
dd80: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68  SSL_METHOD *meth
dd90: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  od;..    dprintf
dda0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
ddb0: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09   if (!proto) {..
ddc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ddd0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
dde0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
ddf0: 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  cted", NULL);..r
de00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
de10: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65  }..    /* create
de20: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
de30: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
de40: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
de50: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66  10100000L || def
de60: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c  ined(NO_SSL2) ||
de70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
de80: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66  _NO_SSL2).    if
de90: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
dea0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
deb0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
dec0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
ded0: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL2 protocol not
dee0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
def0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
df00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
df10: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
df20: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
df30: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
df40: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
df50: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
df60: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL3)) {..Tcl_A
df70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
df80: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63  rp, "SSL3 protoc
df90: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
dfa0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
dfb0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
dfc0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
dfd0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
dfe0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dff0: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e  TLS1).    if (EN
e000: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
e010: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a  _PROTO_TLS1)) {.
e020: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e030: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
e040: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .0 protocol not 
e050: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
e060: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e070: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
e080: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
e090: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
e0a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e0b0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
e0c0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e0d0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09  OTO_TLS1_1)) {..
e0e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e0f0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
e100: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  1 protocol not s
e110: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
e120: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
e130: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
e140: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
e150: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
e160: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
e170: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
e180: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
e190: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54  TO_TLS1_2)) {..T
e1a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e1b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32  interp, "TLS 1.2
e1c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
e1d0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
e1e0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e1f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
e200: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e210: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
e220: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
e230: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
e240: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e250: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63  O_TLS1_3)) {..Tc
e260: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e270: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20  nterp, "TLS 1.3 
e280: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
e290: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
e2a0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e2b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
e2c0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b  f (proto == 0) {
e2d0: 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61  ../* Use full ra
e2e0: 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  nge */..SSL_CTX_
e2f0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
e300: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09  rsion(ctx, 0);..
e310: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
e320: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
e330: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  x, 0);.    }..  
e340: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29    switch (proto)
e350: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
e360: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
e370: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
e380: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
e390: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e3a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
e3b0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
e3c0: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL2:..method =
e3d0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
e3e0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  2_server_method(
e3f0: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74  ) : SSLv2_client
e400: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
e410: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
e420: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
e430: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e440: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
e450: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e460: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
e470: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e480: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f  OTO_SSL3:..metho
e490: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53  d = isServer ? S
e4a0: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68  SLv3_server_meth
e4b0: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69  od() : SSLv3_cli
e4c0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
e4d0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
e4e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e4f0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
e500: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20  PENSSL_NO_TLS1) 
e510: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e520: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48  SSL_NO_TLS1_METH
e530: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
e540: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65  _PROTO_TLS1:..me
e550: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e560: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d  ? TLSv1_server_m
e570: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
e580: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e590: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
e5a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e5b0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
e5c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e5d0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
e5e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e5f0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
e600: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
e610: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_1:..method 
e620: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
e630: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  v1_1_server_meth
e640: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63  od() : TLSv1_1_c
e650: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e660: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
e670: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e680: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
e690: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e6a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
e6b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e6c0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
e6d0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
e6e0: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_2:..method =
e6f0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
e700: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_2_server_metho
e710: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c  d() : TLSv1_2_cl
e720: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
e730: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
e740: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
e750: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
e760: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e770: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c  1_3).    case TL
e780: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a  S_PROTO_TLS1_3:.
e790: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65  ./* Use the gene
e7a0: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63  ric method and c
e7b0: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20  onstraint range 
e7c0: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73  after context is
e7d0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74   created */..met
e7e0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e7f0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68   TLS_server_meth
e800: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e  od() : TLS_clien
e810: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
e820: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
e830: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f  efault:../* Nego
e840: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76  tiate highest av
e850: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20  ailable SSL/TLS 
e860: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68  version */..meth
e870: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
e880: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
e890: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
e8a0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f  _method();.#if O
e8b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e8c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
e8d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
e8e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
e8f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e900: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL2)..off |= (E
e910: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e920: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20  S_PROTO_SSL2)   
e930: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e940: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv2);.#endif.#
e950: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
e960: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
e970: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
e980: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e990: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e9a0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20  OTO_SSL3)   ? 0 
e9b0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
e9c0: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  3);.#endif.#if !
e9d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
e9e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e9f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f  NSSL_NO_TLS1)..o
ea00: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
ea10: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
ea20: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53  TLS1)   ? 0 : SS
ea30: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a  L_OP_NO_TLSv1);.
ea40: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
ea50: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
ea60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
ea70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f  SL_NO_TLS1_1)..o
ea80: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
ea90: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
eaa0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53  TLS1_1) ? 0 : SS
eab0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29  L_OP_NO_TLSv1_1)
eac0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
ead0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
eae0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
eaf0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
eb00: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
eb10: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
eb20: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20  O_TLS1_2) ? 0 : 
eb30: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
eb40: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
eb50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
eb60: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
eb70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
eb80: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
eb90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
eba0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20  OTO_TLS1_3) ? 0 
ebb0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
ebc0: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72  1_3);.#endif..br
ebd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
ebe0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
ebf0: 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53  );..    ctx = SS
ec00: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64  L_CTX_new(method
ec10: 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29  );.    if (!ctx)
ec20: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29   {..return(NULL)
ec30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
ec40: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f  (getenv(SSLKEYLO
ec50: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43  GFILE)) {..SSL_C
ec60: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61  TX_set_keylog_ca
ec70: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c  llback(ctx, KeyL
ec80: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ogCallback);.   
ec90: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
eca0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
ecb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
ecc0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
ecd0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f  f (proto == TLS_
ece0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a  PROTO_TLS1_3) {.
ecf0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e  .SSL_CTX_set_min
ed00: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
ed10: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
ed20: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ON);..SSL_CTX_se
ed30: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
ed40: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
ed50: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a  VERSION);.    }.
ed60: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46  #endif..    /* F
ed70: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65  orce cipher sele
ed80: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73  ction order by s
ed90: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  erver */.    if 
eda0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53  (!isServer) {..S
edb0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
edc0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43  ns(ctx, SSL_OP_C
edd0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45  IPHER_SERVER_PRE
ede0: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a  FERENCE);.    }.
edf0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
ee00: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
ee10: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
ee20: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
ee30: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
ee40: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
ee50: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
ee60: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
ee70: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
ee80: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
ee90: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
eea0: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
eeb0: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69  PRESSION);./* di
eec0: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
eed0: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
eee0: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
eef0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
ef00: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69  tx, off);../* di
ef10: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76  sable protocol v
ef20: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f  ersions */.#if O
ef30: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
ef40: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30  UMBER < 0x101010
ef50: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  00L.    SSL_CTX_
ef60: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53  set_mode(ctx, SS
ef70: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52  L_MODE_AUTO_RETR
ef80: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65  Y);./* handle ne
ef90: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20  w handshakes in 
efa0: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62  background. On b
efb0: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65  y default in Ope
efc0: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23  nSSL 1.1.1. */.#
efd0: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54  endif.    SSL_CT
efe0: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65  X_sess_set_cache
eff0: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b  _size(ctx, 128);
f000: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
f010: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72  r defined cipher
f020: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73  s, cipher suites
f030: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c  , and security l
f040: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
f050: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c  (ciphers != NULL
f060: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
f070: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74  t_cipher_list(ct
f080: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09  x, ciphers)) {..
f090: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f0a0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
f0b0: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f  phers failed: No
f0c0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
f0d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f0e0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f0f0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
f100: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
f110: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
f120: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
f130: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
f140: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
f150: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f  suites)) {..Tcl_
f160: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f170: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
f180: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
f190: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
f1a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
f1b0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
f1c0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
f1d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
f1e0: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20  /* Set security 
f1f0: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
f200: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c  (level > -1 && l
f210: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20  evel < 6) {../* 
f220: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79  SSL_set_security
f230: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43  _level */..SSL_C
f240: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  TX_set_security_
f250: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c  level(ctx, level
f260: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f270: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
f280: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
f290: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
f2a0: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
f2b0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
f2c0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
f2d0: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
f2e0: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c  cb_userdata(ctx,
f2f0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
f300: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  r);..    /* read
f310: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
f320: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
f330: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
f340: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69  ilt-in one */.#i
f350: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  fdef OPENSSL_NO_
f360: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  DH.    if (DHpar
f370: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
f380: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f390: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72  (interp, "DH par
f3a0: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e  ameter support n
f3b0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28  ot available", (
f3c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f3d0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f3e0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
f3f0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
f400: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20   {..DH* dh;..if 
f410: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
f420: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62  L) {..    BIO *b
f430: 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  io;..    Tcl_DSt
f440: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09  ringInit(&ds);..
f450: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65      bio = BIO_ne
f460: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72  w_file(F2N(DHpar
f470: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b  ams, &ds), "r");
f480: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20  ..    if (!bio) 
f490: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
f4a0: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f  ree(&ds);...Tcl_
f4b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f4c0: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
f4d0: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65  find DH paramete
f4e0: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  rs file", (char 
f4f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
f500: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f510: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
f520: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20     }...    dh = 
f530: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70  PEM_read_bio_DHp
f540: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c  arams(bio, NULL,
f550: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20   NULL, NULL);.. 
f560: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29     BIO_free(bio)
f570: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
f580: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
f590: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54    if (!dh) {...T
f5a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f5b0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
f5c0: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d  ot read DH param
f5d0: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22  eters from file"
f5e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f5f0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
f600: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
f610: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20  NULL;..    }..} 
f620: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d  else {..    dh =
f630: 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b   get_dhParams();
f640: 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ..}..SSL_CTX_set
f650: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
f660: 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a  ;..DH_free(dh);.
f670: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
f680: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72    /* set our cer
f690: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20  tificate */.    
f6a0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
f6b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65   = 0;.    if (ce
f6c0: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  rtfile != NULL) 
f6d0: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
f6e0: 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44  key = 1;...Tcl_D
f6f0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
f700: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
f710: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
f720: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72  ile(ctx, F2N(cer
f730: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  tfile, &ds), SSL
f740: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
f750: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
f760: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f770: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
f780: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f790: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
f7a0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
f7b0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
f7c0: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
f7d0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f7e0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f7f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f800: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f810: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  }.    } else if 
f820: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (cert != NULL) {
f830: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
f840: 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c  ey = 1;..if (SSL
f850: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
f860: 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63  cate_ASN1(ctx, c
f870: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c  ert_len, cert) <
f880: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
f890: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f8a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
f8b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f8c0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
f8d0: 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09  ertificate: ",..
f8e0: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c  ..     REASON(),
f8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f900: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
f910: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
f920: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  turn NULL;..}.  
f930: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74    } else {..cert
f940: 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35  file = (char*)X5
f950: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63  09_get_default_c
f960: 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66  ert_file();...if
f970: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
f980: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
f990: 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53  tx, certfile, SS
f9a0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
f9b0: 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20  <= 0) {.#if 0.. 
f9c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f9d0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
f9e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f9f0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
fa00: 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65  o use default ce
fa10: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22  rtificate file "
fa20: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22  , certfile, ": "
fa30: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e  ,....     REASON
fa40: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
fa50: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
fa60: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
fa70: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65   return NULL;.#e
fa80: 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ndif..}.    }.. 
fa90: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72     /* set our pr
faa0: 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20  ivate key */.   
fab0: 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74   if (load_privat
fac0: 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65  e_key) {..if (ke
fad0: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26  yfile == NULL &&
fae0: 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   key == NULL) {.
faf0: 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63  .    keyfile = c
fb00: 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66  ertfile;..}...if
fb10: 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c   (keyfile != NUL
fb20: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74  L) {..    /* get
fb30: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79   the private key
fb40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fb50: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74   this certificat
fb60: 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65  e */..    if (ke
fb70: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  yfile == NULL) {
fb80: 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72  ...keyfile = cer
fb90: 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09  tfile;..    }...
fba0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
fbb0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66  use_PrivateKey_f
fbc0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79  ile(ctx, F2N(key
fbd0: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
fbe0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
fbf0: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72   0) {...Tcl_DStr
fc00: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
fc10: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
fc20: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
fc30: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
fc40: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54  he result */...T
fc50: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
fc60: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
fc70: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70  TATIC);...Tcl_Ap
fc80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fc90: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
fca0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c  t public key fil
fcb0: 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20  e ", keyfile, " 
fcc0: 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 52  ",....         R
fcd0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
fce0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
fcf0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
fd00: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
fd10: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
fd20: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
fd30: 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20  .} else if (key 
fd40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
fd50: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
fd60: 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28  PrivateKey_ASN1(
fd70: 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74  EVP_PKEY_RSA, ct
fd80: 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20  x, key,key_len) 
fd90: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53  <= 0) {...Tcl_DS
fda0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
fdb0: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
fdc0: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
fdd0: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
fde0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
fdf0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
fe00: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
fe10: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
fe20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fe30: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
fe40: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20  set public key: 
fe50: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
fe60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
fe70: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
fe80: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
fe90: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e  ..    }..}../* N
fea0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ow we know that 
feb0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68  a key and cert h
fec0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61  ave been set aga
fed0: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c  inst.. * the SSL
fee0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20   context */..if 
fef0: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f  (!SSL_CTX_check_
ff00: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29  private_key(ctx)
ff10: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
ff20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ff30: 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64  , "private key d
ff40: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
ff50: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75  e certificate pu
ff60: 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20  blic key",....  
ff70: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c     (char *) NULL
ff80: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
ff90: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
ffa0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
ffb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
ffc0: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43  t verification C
ffd0: 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  As */.    Tcl_DS
ffe0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
fff0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
10000 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f  nit(&ds1);.    /
10010 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64  * There is one d
10020 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
10030 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69  , one default fi
10040 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61  le, and one defa
10050 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20  ult store...The 
10060 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69  default CA certi
10070 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72  ficates director
10080 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73  y (and default s
10090 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 20  tore) is in the 
100a0 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64  OpenSSL..certs d
100b0 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e  irectory. It can
100c0 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
100d0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44  y the SSL_CERT_D
100e0 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a  IR env var. The.
100f0 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74  .default CA cert
10100 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 73  ificates file is
10110 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d   called cert.pem
10120 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20   in the default 
10130 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f  OpenSSL..directo
10140 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76  ry. It can be ov
10150 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
10160 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e  SSL_CERT_FILE en
10170 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e  v var. */../* in
10180 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  t SSL_CTX_set_de
10190 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72  fault_verify_dir
101a0 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61  (SSL_CTX *ctx) a
101b0 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73  nd int SSL_CTX_s
101c0 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
101d0 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a  y_file(SSL_CTX *
101e0 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28  ctx) */.    if (
101f0 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
10200 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
10210 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
10220 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c  &ds), F2N(CAdir,
10230 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c   &ds1)) ||..!SSL
10240 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
10250 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
10260 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c  x)) {.#if 0..Tcl
10270 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10280 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
10290 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44  ree(&ds1);../* D
102a0 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63  on't currently c
102b0 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c  are if this fail
102c0 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  s */..Tcl_Append
102d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
102e0 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69  SSL default veri
102f0 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41  fy paths: ", REA
10300 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
10310 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
10320 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
10330 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
10340 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74      }..    /* ht
10350 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67  tps://sourceforg
10360 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73  e.net/p/tls/bugs
10370 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58  /57/ */.    /* X
10380 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65  XX:TODO: Let the
10390 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c   user supply val
103a0 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64  ues here instead
103b0 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   of something th
103c0 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  at exists on the
103d0 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20   filesystem */. 
103e0 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d     if (CAfile !=
103f0 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f   NULL) {..STACK_
10400 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
10410 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
10420 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
10430 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
10440 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e  ds));..if (certN
10450 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ames != NULL) {.
10460 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
10470 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
10480 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b  ctx, certNames);
10490 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ..}.    }..    T
104a0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
104b0 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ds);.    Tcl_DSt
104c0 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
104d0 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a      return ctx;.
104e0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
10530 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20   * StatusObjCmd 
10540 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66  -- return certif
10550 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63  icate for connec
10560 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20  ted peer.. *. * 
10570 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
10580 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
10590 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
105a0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
105b0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
10600 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62  tic int.StatusOb
10610 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
10620 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
10630 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
10640 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
10650 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
10660 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
10670 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39  atePtr;.    X509
10680 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f   *peer;.    Tcl_
10690 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20  Obj *objPtr;.   
106a0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
106b0 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61  n;.    char *cha
106c0 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65  nnelName, *ciphe
106d0 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  rs;.    int mode
106e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
106f0 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
10700 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
10710 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  nt len;.    int 
10720 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  nid, res;..    d
10730 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
10740 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
10750 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20  < 2 || objc > 3 
10760 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26  || (objc == 3 &&
10770 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   !strcmp(Tcl_Get
10780 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10790 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09   "-local"))) {..
107a0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
107b0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
107c0 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
107d0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
107e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
107f0 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
10800 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
10810 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
10820 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10830 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32  (objv[(objc == 2
10840 20 3f 20 31 20 3a 20 32 29 5d 2c 20 4e 55 4c 4c   ? 1 : 2)], NULL
10850 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  );.    chan = Tc
10860 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
10870 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  erp, channelName
10880 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66  , &mode);.    if
10890 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
108a0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
108b0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
108c0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
108d0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
108e0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
108f0 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10900 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10910 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10920 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10930 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
10940 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
10950 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
10960 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10970 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
10980 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
10990 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
109a0 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
109b0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
109c0 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
109d0 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
109e0 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20  TLS", "STATUS", 
109f0 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
10a00 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
10a10 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
10a20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10a30 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
10a40 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43  tate *) Tcl_GetC
10a50 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
10a60 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  ta(chan);..    /
10a70 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74  * Get certificat
10a80 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65  e for peer or se
10a90 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  lf */.    if (ob
10aa0 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72  jc == 2) {..peer
10ab0 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
10ac0 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
10ad0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10ae0 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d  } else {..peer =
10af0 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69   SSL_get_certifi
10b00 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
10b10 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  sl);.    }.    /
10b20 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69  * Get X509 certi
10b30 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20  ficate info */. 
10b40 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09     if (peer) {..
10b50 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77  objPtr = Tls_New
10b60 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
10b70 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63  peer);..if (objc
10b80 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35   == 2) {..    X5
10b90 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09  09_free(peer);..
10ba0 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b      peer = NULL;
10bb0 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
10bc0 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e  ..objPtr = Tcl_N
10bd0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
10be0 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  L);.    }..    /
10bf0 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20  * Peer name */. 
10c00 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10c10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10c20 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67  peername", SSL_g
10c30 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61  et0_peername(sta
10c40 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
10c50 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
10c60 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
10c70 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67  , "sbits", SSL_g
10c80 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73  et_cipher_bits(s
10c90 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55  tatePtr->ssl, NU
10ca0 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65  LL));..    ciphe
10cb0 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f  rs = (char*)SSL_
10cc0 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65  get_cipher(state
10cd0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c  Ptr->ssl);.    L
10ce0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10cf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
10d00 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31  er", ciphers, -1
10d10 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
10d20 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69  y the X509 certi
10d30 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64  ficate presented
10d40 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a   by the peer */.
10d50 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10d60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10d70 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a  "verifyResult",.
10d80 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72  .X509_verify_cer
10d90 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53  t_error_string(S
10da0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
10db0 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
10dc0 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  sl)), -1);..    
10dd0 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a  /* Verify mode *
10de0 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c  /.    mode = SSL
10df0 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65  _get_verify_mode
10e00 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
10e10 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26  .    if (mode &&
10e20 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45   SSL_VERIFY_NONE
10e30 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  ) {..LAPPEND_STR
10e40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10e50 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22   "verifyMode", "
10e60 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
10e70 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62  } else {..Tcl_Ob
10e80 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20  j *listObjPtr = 
10e90 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
10ea0 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f  , NULL);..if (mo
10eb0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
10ec0 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63  _PEER) {..    Tc
10ed0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10ee0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10ef0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10f00 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65  ewStringObj("pee
10f10 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  r", -1));..}..if
10f20 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10f30 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
10f40 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20  PEER_CERT) {..  
10f50 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10f60 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10f70 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
10f80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10f90 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72  "fail if no peer
10fa0 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d   cert", -1));..}
10fb0 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
10fc0 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
10fd0 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  ONCE) {..    Tcl
10fe0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10ff0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
11000 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
11010 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65  wStringObj("clie
11020 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a  nt once", -1));.
11030 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
11040 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f  SSL_VERIFY_POST_
11050 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20  HANDSHAKE) {..  
11060 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11070 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11080 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
11090 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
110a0 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22  "post handshake"
110b0 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50  , -1));..}..LAPP
110c0 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
110d0 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
110e0 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72  ode", listObjPtr
110f0 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ).    }..    /* 
11100 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74  Verify mode dept
11110 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  h */.    LAPPEND
11120 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11130 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74  Ptr, "verifyDept
11140 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  h", SSL_get_veri
11150 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74  fy_depth(statePt
11160 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f  r->ssl));..    /
11170 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
11180 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
11190 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
111a0 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  e negotiation */
111b0 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c  .    SSL_get0_al
111c0 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74  pn_selected(stat
111d0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74  ePtr->ssl, &prot
111e0 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41  o, &len);.    LA
111f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11200 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22  , objPtr, "alpn"
11210 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c  , (char *)proto,
11220 20 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20   (int) len);.   
11230 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
11250 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
11260 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74  _version(statePt
11270 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20  r->ssl), -1);.. 
11280 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
11290 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
112a0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
112b0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
112c0 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
112d0 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
112e0 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
112f0 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
11300 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
11310 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  = SSL_get_signat
11320 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
11330 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
11340 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
11350 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20  ) {nid = 0;}.   
11360 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11370 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69  erp, objPtr, "si
11380 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72  gnatureHashAlgor
11390 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ithm", OBJ_nid2l
113a0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
113b0 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
113c0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
113d0 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
113e0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
113f0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
11400 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
11410 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
11420 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73  ature_type_nid(s
11430 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
11440 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
11450 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
11460 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
11470 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11480 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79  tr, "signatureTy
11490 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  pe", OBJ_nid2ln(
114a0 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  nid), -1);..    
114b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
114c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
114d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
114e0 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
114f0 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
11500 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
11510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
11550 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
11560 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
11570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
11580 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
11590 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
115a0 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
115b0 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
115c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11600 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
11610 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
11620 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
11630 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
11640 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11650 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
11660 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
11670 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
11680 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
11690 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
116a0 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
116b0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
116c0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
116d0 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
116e0 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
116f0 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
11700 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
11710 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
11720 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
11730 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
11740 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
11750 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
11760 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
11770 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
11780 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
11790 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
117a0 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
117b0 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  el");..return(TC
117c0 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
117d0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
117e0 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
117f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11800 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
11810 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
11820 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
11830 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
11840 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c  L) {..return(TCL
11850 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
11860 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
11870 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
11880 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
11890 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
118a0 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
118b0 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
118c0 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
118d0 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
118e0 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
118f0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
11900 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
11910 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
11920 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
11930 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c  e(chan),..    "\
11940 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
11950 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
11960 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
11970 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
11980 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48  CONNECTION", "CH
11990 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
119a0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
119b0 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
119c0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
119d0 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
119e0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
119f0 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
11a00 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
11a10 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
11a20 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
11a30 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
11a40 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
11a50 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
11a60 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
11a70 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
11a80 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
11a90 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11aa0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11ab0 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65  tate", SSL_state
11ac0 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
11ad0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
11ae0 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
11af0 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c  erver name */..L
11b00 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11b10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76  p, objPtr, "serv
11b20 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74  ername", SSL_get
11b30 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
11b40 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
11b50 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29  _host_name), -1)
11b60 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
11b70 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
11b80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11b90 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
11ba0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
11bb0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
11bc0 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
11bd0 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
11be0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11bf0 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
11c00 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
11c10 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
11c20 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
11c30 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  port(ssl));.../*
11c40 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65   Get security le
11c50 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  vel */..LAPPEND_
11c60 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11c70 74 72 2c 20 22 73 65 63 75 72 69 74 79 6c 65 76  tr, "securitylev
11c80 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  el", SSL_get_sec
11c90 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
11ca0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
11cb0 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
11cc0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11cd0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72  jPtr, "session_r
11ce0 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73  eused", SSL_sess
11cf0 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
11d00 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
11d10 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
11d20 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11d30 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65  bjPtr, "is_serve
11d40 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65  r", SSL_is_serve
11d50 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  r(ssl));.../* Is
11d60 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e   DTLS */..LAPPEN
11d70 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11d80 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22  bjPtr, "is_dtls"
11d90 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73  , SSL_is_dtls(ss
11da0 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
11db0 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
11dc0 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
11dd0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
11de0 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
11df0 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
11e00 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
11e10 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
11e20 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
11e30 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
11e40 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
11e50 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11e60 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
11e70 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
11e80 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
11e90 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
11ea0 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
11eb0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11ec0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
11ed0 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
11ee0 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
11ef0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
11f00 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
11f10 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
11f20 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11f30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
11f40 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
11f50 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
11f60 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
11f70 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
11f80 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
11f90 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
11fa0 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
11fb0 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
11fc0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
11fd0 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
11fe0 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
11ff0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12000 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
12010 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
12020 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12030 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
12040 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
12050 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
12060 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
12070 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
12080 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
12090 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
120a0 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
120b0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
120c0 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
120d0 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
120e0 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
120f0 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
12100 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
12110 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
12120 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
12130 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
12140 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
12150 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12160 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
12170 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
12180 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
12190 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
121a0 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
121b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
121c0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
121d0 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
121e0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
121f0 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
12200 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12210 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12220 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12230 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
12240 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
12250 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
12260 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
12270 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
12280 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12290 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
122a0 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
122b0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
122c0 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
122d0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
122e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
122f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
12300 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
12310 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12320 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12330 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
12340 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
12350 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
12360 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
12370 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
12380 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
12390 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
123a0 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
123b0 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
123c0 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
123d0 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
123e0 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
123f0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
12400 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
12410 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
12420 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
12430 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
12440 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
12450 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
12460 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
12470 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
12480 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
12490 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
124a0 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
124b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
124c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
124d0 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
124e0 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
124f0 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
12500 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
12510 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
12520 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
12530 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12540 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
12550 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
12560 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
12570 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
12580 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
12590 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
125a0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
125b0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
125c0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
125d0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
125e0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
125f0 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
12600 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
12610 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
12620 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
12630 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
12640 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
12650 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
12660 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
12670 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
12680 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12690 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
126a0 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
126b0 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
126c0 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
126d0 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
126e0 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
126f0 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
12700 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
12710 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
12720 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
12730 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
12740 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
12750 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
12760 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
12770 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68  _id, *proto;..ch
12780 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
12790 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
127a0 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
127b0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
127c0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
127d0 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
127e0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
127f0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
12800 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
12810 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
12820 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
12830 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12840 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
12850 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e  ar *) proto, (in
12860 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52  t) len2);.../* R
12870 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
12880 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
12890 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e   result of the N
128a0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
128b0 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
128c0 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f  ..SSL_get0_next_
128d0 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64  proto_negotiated
128e0 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75  (ssl, &proto, &u
128f0 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
12900 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12910 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20  r, "npn", (char 
12920 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20  *) proto, (int) 
12930 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ulen);.#endif...
12940 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73  /* Resumable ses
12950 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  sion */..LAPPEND
12960 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
12970 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65  jPtr, "resumable
12980 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69  ", SSL_SESSION_i
12990 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73  s_resumable(sess
129a0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ion));.../* Sess
129b0 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28  ion start time (
129c0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70  seconds since ep
129d0 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  och) */..LAPPEND
129e0 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62  _LONG(interp, ob
129f0 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d  jPtr, "start_tim
12a00 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
12a10 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e  get_time(session
12a20 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74  ));.../* Timeout
12a30 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58   value - SSL_CTX
12a40 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e  _get_timeout (in
12a50 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41   seconds) */..LA
12a60 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
12a70 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65  p, objPtr, "time
12a80 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  out", SSL_SESSIO
12a90 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65  N_get_timeout(se
12aa0 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65  ssion));.../* Se
12ab0 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31  ssion id - TLSv1
12ac0 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c  .2 and below onl
12ad0 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  y */..session_id
12ae0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12af0 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
12b00 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
12b10 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
12b20 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
12b30 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  id", session_id,
12b40 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09   (int) ulen);...
12b50 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65  /* Session conte
12b60 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69  xt */..session_i
12b70 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
12b80 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28  get0_id_context(
12b90 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
12ba0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
12bb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12bc0 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78   "session_contex
12bd0 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20  t", session_id, 
12be0 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  (int) ulen);.../
12bf0 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
12c00 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
12c10 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
12c20 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
12c30 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
12c40 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
12c50 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
12c60 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69  Ptr, "session_ti
12c70 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28  cket", ticket, (
12c80 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  int) len2);.../*
12c90 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
12ca0 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69  lifetime hint (i
12cb0 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c  n seconds) */..L
12cc0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
12cd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66  rp, objPtr, "lif
12ce0 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53  etime", SSL_SESS
12cf0 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
12d00 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
12d10 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63  sion));.../* Tic
12d20 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a  ket app data */.
12d30 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
12d40 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61  0_ticket_appdata
12d50 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
12d60 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  t, &len2);..LAPP
12d70 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12d80 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b  p, objPtr, "tick
12d90 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69  et_app_data", ti
12da0 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32  cket, (int) len2
12db0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74  );.../* Get mast
12dc0 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20  er key */..len2 
12dd0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
12de0 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73  t_master_key(ses
12df0 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53  sion, buffer, SS
12e00 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
12e10 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45  _LENGTH);..LAPPE
12e20 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
12e30 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65  , objPtr, "maste
12e40 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20  r_key", buffer, 
12e50 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  (int) len2);.../
12e60 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64  * Compression id
12e70 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   */..unsigned in
12e80 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  t id = SSL_SESSI
12e90 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f  ON_get_compress_
12ea0 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41  id(session);..LA
12eb0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12ec0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
12ed0 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d  ession_id", id =
12ee0 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22  = 1 ? "zlib" : "
12ef0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
12f00 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  }..    /* Compre
12f10 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
12f20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
12f30 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45  L) {.#ifdef HAVE
12f40 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _SSL_COMPRESSION
12f50 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54  ..const COMP_MET
12f60 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e  HOD *comp, *expn
12f70 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65  ;..comp = SSL_ge
12f80 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65  t_current_compre
12f90 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70  ssion(ssl);..exp
12fa0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  n = SSL_get_curr
12fb0 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73  ent_expansion(ss
12fc0 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l);...LAPPEND_ST
12fd0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12fe0 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  , "compression",
12ff0 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50   comp ? SSL_COMP
13000 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
13010 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  : "none", -1);..
13020 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
13030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
13040 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20  ansion", expn ? 
13050 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
13060 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22  e(expn) : "none"
13070 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41  , -1);.#else..LA
13080 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
13090 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
130a0 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ession", "none",
130b0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
130c0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
130d0 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
130e0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e  "none", -1);.#en
130f0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
13100 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  * Server info */
13110 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64  .    {..long mod
13120 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f  e = SSL_CTX_get_
13130 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
13140 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
13150 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a  );..char *msg;..
13160 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
13170 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20  SESS_CACHE_OFF) 
13180 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66  {..    msg = "of
13190 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  f";..} else if (
131a0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
131b0 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
131c0 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65  .    msg = "clie
131d0 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  nt";..} else if 
131e0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
131f0 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b  _CACHE_SERVER) {
13200 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72  ..    msg = "ser
13210 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
13220 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
13230 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a  S_CACHE_BOTH) {.
13240 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68  .    msg = "both
13250 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ";..} else {..  
13260 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e    msg = "unknown
13270 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53  ";..}..LAPPEND_S
13280 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
13290 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  r, "session_cach
132a0 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31  e_mode", msg, -1
132b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
132c0 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20   CA List */.    
132d0 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76  /* IF not a serv
132e0 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  er, same as SSL_
132f0 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73  get0_peer_CA_lis
13300 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d  t. If server sam
13310 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74  e as SSL_CTX_get
13320 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20  _client_CA_list 
13330 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d  */.    listPtr =
13340 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
13350 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54  0, NULL);.    ST
13360 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
13370 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20  ) *ca_list;.    
13380 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53  if ((ca_list = S
13390 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  SL_get_client_CA
133a0 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e  _list(ssl)) != N
133b0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
133c0 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f  fer[BUFSIZ];..fo
133d0 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
133e0 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e  < sk_X509_NAME_n
133f0 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b  um(ca_list); i++
13400 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  ) {..    X509_NA
13410 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35  ME *name = sk_X5
13420 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61  09_NAME_value(ca
13430 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20  _list, i);..    
13440 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35  if (name) {...X5
13450 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28  09_NAME_oneline(
13460 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55  name, buffer, BU
13470 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73  FSIZ);...Tcl_Lis
13480 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13490 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
134a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
134b0 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29  Obj(buffer, -1))
134c0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
134d0 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  }.    LAPPEND_OB
134e0 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  J(interp, objPtr
134f0 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74  , "caList", list
13500 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  Ptr);.    LAPPEN
13510 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
13520 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75  jPtr, "caListCou
13530 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  nt", sk_X509_NAM
13540 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b  E_num(ca_list));
13550 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
13560 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
13570 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
13580 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
13590 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
135a0 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135f0 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f  -. *. * VersionO
13600 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
13610 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
13620 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
13630 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
13640 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
13650 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
13660 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
13670 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
136c0 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69  static int.Versi
136d0 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  onObjCmd(ClientD
136e0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
136f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13700 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
13710 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
13720 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
13730 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20  bj *objPtr;..   
13740 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13750 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
13760 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
13770 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
13780 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
13790 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
137a0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
137b0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
137c0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
137d0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
137e0 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a  ;..objc = objc;.
137f0 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a  .objv = objv;.}.
13800 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13850 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d   MiscObjCmd -- m
13860 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  isc commands. *.
13870 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
13880 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
13890 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
138a0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
138b0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
13900 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f  static int.MiscO
13910 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
13920 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
13930 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13940 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
13950 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
13960 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  ) {.    static c
13970 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61  onst char *comma
13980 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22  nds [] = { "req"
13990 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c  , "strreq", NULL
139a0 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d   };.    enum com
139b0 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f  mand { C_REQ, C_
139c0 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20  STRREQ, C_DUMMY 
139d0 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20  };.    int cmd, 
139e0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20  isStr;.    char 
139f0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a  buffer[16384];..
13a00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
13a10 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
13a20 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
13a30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13a40 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
13a50 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
13a60 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
13a70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13a80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
13a90 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
13aa0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
13ab0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
13ac0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
13ad0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
13ae0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
13af0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
13b00 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
13b10 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
13b20 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
13b30 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
13b40 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
13b50 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
13b60 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
13b70 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
13b80 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
13b90 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
13ba0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
13bb0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
13bc0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e  **listv;..    in
13bd0 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20  t listc,i;...   
13be0 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a   BIO *out=NULL;.
13bf0 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d  ..    char *k_C=
13c00 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c  "",*k_ST="",*k_L
13c10 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f  ="",*k_O="",*k_O
13c20 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b  U="",*k_CN="",*k
13c30 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20  _Email="";..    
13c40 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65  char *keyout,*pe
13c50 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20  mout,*str;..    
13c60 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69  int keysize,seri
13c70 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a  al=0,days=365;..
13c80 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
13c90 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
13ca0 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49  0000000L..    BI
13cb0 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c  GNUM *bne = NULL
13cc0 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20  ;..    RSA *rsa 
13cd0 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20  = NULL;.#else.. 
13ce0 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20     EVP_PKEY_CTX 
13cf0 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  *ctx = NULL;.#en
13d00 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f  dif...    if ((o
13d10 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e  bjc<5) || (objc>
13d20 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e  6)) {...Tcl_Wron
13d30 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13d40 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69   2, objv, "keysi
13d50 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66  ze keyfile certf
13d60 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09  ile ?info?");...
13d70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13d80 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
13d90 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
13da0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13db0 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20  v[2], &keysize) 
13dc0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72  != TCL_OK) {...r
13dd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13de0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79  ..    }..    key
13df0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
13e00 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20  g(objv[3]);..   
13e10 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53   pemout=Tcl_GetS
13e20 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
13e30 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20  .    if (isStr) 
13e40 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69  {...Tcl_SetVar(i
13e50 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c  nterp,keyout,"",
13e60 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  0);...Tcl_SetVar
13e70 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22  (interp,pemout,"
13e80 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  ",0);..    }... 
13e90 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20     if (objc>=6) 
13ea0 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  {...if (Tcl_List
13eb0 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
13ec0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a  nterp, objv[5],.
13ed0 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ...&listc, &list
13ee0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
13ef0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13f00 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
13f10 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
13f20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
13f30 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13f40 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
13f50 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
13f60 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
13f70 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
13f80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13f90 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
13fa0 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
13fb0 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
13fc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13fd0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
13fe0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
13ff0 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
14000 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
14010 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
14020 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
14030 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
14040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14050 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
14060 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
14070 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
14080 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
14090 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
140a0 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
140b0 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
140c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
140d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
140e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
140f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d  ")==0) {....k_C=
14100 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14110 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14120 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14130 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29  mp(str,"ST")==0)
14140 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47   {....k_ST=Tcl_G
14150 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
14160 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
14170 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
14180 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"L")==0) {....
14190 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_L=Tcl_GetStrin
141a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
141b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
141c0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d  strcmp(str,"O")=
141d0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c  =0) {....k_O=Tcl
141e0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
141f0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
14200 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
14210 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a  str,"OU")==0) {.
14220 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53  ...k_OU=Tcl_GetS
14230 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
14240 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
14250 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
14260 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  CN")==0) {....k_
14270 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  CN=Tcl_GetString
14280 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
14290 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
142a0 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c  trcmp(str,"Email
142b0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d  ")==0) {....k_Em
142c0 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  ail=Tcl_GetStrin
142d0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
142e0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
142f0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
14300 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70  nterp,"Unknown p
14310 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b  arameter",NULL);
14320 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ....return TCL_E
14330 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09  RROR;...    }...
14340 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  }..    }..#if OP
14350 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
14360 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
14370 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e  0L..    bne = BN
14380 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61  _new();..    rsa
14390 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20   = RSA_new();.. 
143a0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b     pkey = EVP_PK
143b0 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69  EY_new();..    i
143c0 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c  f (bne == NULL |
143d0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | rsa == NULL ||
143e0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   pkey == NULL ||
143f0 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e   !BN_set_word(bn
14400 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21  e,RSA_F4) ||...!
14410 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79  RSA_generate_key
14420 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65  _ex(rsa, keysize
14430 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20  , bne, NULL) || 
14440 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e  !EVP_PKEY_assign
14450 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29  _RSA(pkey, rsa))
14460 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
14470 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52  ee(pkey);.../* R
14480 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72  SA_free(rsa); fr
14490 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f  eed by EVP_PKEY_
144a0 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65  free */...BN_fre
144b0 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20  e(bne);.#else.. 
144c0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53     pkey = EVP_RS
144d0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  A_gen((unsigned 
144e0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09  int) keysize);..
144f0 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b      ctx = EVP_PK
14500 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c  EY_CTX_new(pkey,
14510 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28  NULL);..    if (
14520 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
14530 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  ctx == NULL || !
14540 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f  EVP_PKEY_keygen_
14550 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21  init(ctx) ||...!
14560 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74  EVP_PKEY_CTX_set
14570 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73  _rsa_keygen_bits
14580 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c  (ctx, keysize) |
14590 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
145a0 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20  en(ctx, &pkey)) 
145b0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
145c0 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50  e(pkey);...EVP_P
145d0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78  KEY_CTX_free(ctx
145e0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f  );.#endif...Tcl_
145f0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
14600 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
14610 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c  ng private key",
14620 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
14630 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
14640 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69  } else {...if (i
14650 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
14660 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
14670 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
14680 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
14690 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
146a0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
146b0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d  ,NULL);...    i=
146c0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
146d0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
146e0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
146f0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
14700 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
14710 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
14720 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
14730 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
14740 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
14750 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14760 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
14770 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
14780 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
14790 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
147a0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
147b0 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20  t,keyout);...   
147c0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
147d0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
147e0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
147f0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
14800 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69   /* PEM_write_bi
14810 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28  o_RSAPrivateKey(
14820 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20  out, rsa, NULL, 
14830 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e  NULL, 0, NULL, N
14840 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42  ULL); */...    B
14850 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
14860 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63  ;.. .}....if ((c
14870 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d  ert=X509_new())=
14880 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54  =NULL) {...    T
14890 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
148a0 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
148b0 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ating certificat
148c0 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29  e request",NULL)
148d0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
148e0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
148f0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
14900 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
14910 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
14920 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
14930 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
14940 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09  L_ERROR);...}...
14950 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f  .X509_set_versio
14960 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e  n(cert,2);...ASN
14970 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35  1_INTEGER_set(X5
14980 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d  09_get_serialNum
14990 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c  ber(cert),serial
149a0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
149b0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
149c0 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30  otBefore(cert),0
149d0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
149e0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
149f0 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c  otAfter(cert),(l
14a00 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79  ong)60*60*24*day
14a10 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70  s);...X509_set_p
14a20 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29  ubkey(cert,pkey)
14a30 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67  ;....name=X509_g
14a40 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
14a50 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e  cert);....X509_N
14a60 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
14a70 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d  _txt(name,"C", M
14a80 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
14a90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14aa0 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  r *) k_C, -1, -1
14ab0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
14ac0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14ad0 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
14ae0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14af0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14b00 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31   *) k_ST, -1, -1
14b10 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
14b20 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14b30 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53  xt(name,"L", MBS
14b40 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14b50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14b60 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_L, -1, -1, 
14b70 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14b80 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14b90 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52  (name,"O", MBSTR
14ba0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14bb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14bc0 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_O, -1, -1, 0)
14bd0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14be0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14bf0 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49  ame,"OU", MBSTRI
14c00 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14c10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14c20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
14c30 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14c40 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14c50 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
14c60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14c80 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_CN, -1, -1, 0)
14c90 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14ca0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14cb0 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53  ame,"Email", MBS
14cc0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14cd0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14ce0 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20  *) k_Email, -1, 
14cf0 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f  -1, 0);....X509_
14d00 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  set_subject_name
14d10 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09  (cert,name);....
14d20 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63  if (!X509_sign(c
14d30 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61  ert,pkey,EVP_sha
14d40 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20  256())) {...    
14d50 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
14d60 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
14d70 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
14d80 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14d90 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
14da0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
14db0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
14dc0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
14dd0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
14de0 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66  r signing certif
14df0 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09  icate",NULL);...
14e00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14e10 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
14e20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
14e30 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
14e40 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
14e50 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
14e60 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
14e70 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f      i=BIO_read(o
14e80 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66  ut,buffer,sizeof
14e90 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20  (buffer)-1);... 
14ea0 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a     i=(i<0) ? 0 :
14eb0 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72   i;...    buffer
14ec0 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20  [i]='\0';...    
14ed0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
14ee0 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c  p,pemout,buffer,
14ef0 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c  0);...    BIO_fl
14f00 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20  ush(out);...    
14f10 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09  BIO_free(out);..
14f20 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
14f30 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
14f40 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20  s_file());...   
14f50 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e   BIO_write_filen
14f60 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b  ame(out,pemout);
14f70 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14f80 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
14f90 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  rt);...    BIO_f
14fa0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09  ree_all(out);...
14fb0 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63  }....X509_free(c
14fc0 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  ert);...EVP_PKEY
14fd0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
14fe0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
14ff0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
15000 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28  0000L...BN_free(
15010 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20  bne);.#endif..  
15020 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20    }..}..break;. 
15030 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65     default:..bre
15040 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ak;.    }.    re
15050 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
15060 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
15070 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a  tData;.}.../****
15080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15090 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20  /./* Init       
150a0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
150b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
150c0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
15110 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20  Tls_Free --. *. 
15120 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
15130 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
15140 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
15150 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
15160 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
15170 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
15180 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a  falls below 1. *
15190 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
151a0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
151b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
151c0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
151d0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
15220 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20  d.Tls_Free(char 
15230 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20  *blockPtr) {.   
15240 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
15250 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63   = (State *)bloc
15260 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  kPtr;..    dprin
15270 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
15280 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
15290 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
152a0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
152b0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
15300 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
15310 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
15320 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
15330 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
15340 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
15350 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
15360 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
15370 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
15380 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
15390 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
153a0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
153b0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
153c0 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
153d0 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
153e0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
153f0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
15400 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
15410 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
15420 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
15470 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28  .void Tls_Clean(
15480 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
15490 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
154a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
154b0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61  *.     * we're a
154c0 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
154d0 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
154e0 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a  hreaded.     */.
154f0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
15500 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
15510 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
15520 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
15530 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
15540 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
15550 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
15560 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
15570 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
15580 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
15590 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
155a0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
155b0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
155c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
155d0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
155e0 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
155f0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
15600 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
15610 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
15620 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
15630 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
15640 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
15650 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
15660 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
15670 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15680 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
15690 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
156a0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
156b0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
156c0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
156d0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
156e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
156f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15700 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
15710 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
15720 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
15730 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
15740 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
15750 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
15760 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
15770 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
15780 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
15790 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
157a0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
157b0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
157c0 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
157d0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
157e0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
157f0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
15800 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
15810 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
15820 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
15830 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
15840 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
15850 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
15860 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
15870 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
15880 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ing");.}.../*. *
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e  ---. *. * Tls_In
158e0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
158f0 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
15900 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
15910 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73  cedure, which is
15920 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63   called. *.by Tc
15930 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b  l when this pack
15940 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64  age is to be add
15950 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72  ed to an interpr
15960 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  eter.. *. * Resu
15970 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67  lts:  Ssl config
15980 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a  ured and loaded.
15990 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
159a0 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74  ts:. *. create t
159b0 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20  he ssl command, 
159c0 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63  initialize ssl c
159d0 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ontext. *. *----
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15a20 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e   */.DLLEXPORT in
15a30 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49  t Tls_Init(Tcl_I
15a40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
15a50 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
15a60 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
15a70 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20  [] = {.#include 
15a80 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30  "tls.tcl.h"..0x0
15a90 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70  0.    };..    dp
15aa0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
15ab0 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f  ..#if TCL_MAJOR_
15ac0 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 69 66 64  VERSION > 8.#ifd
15ad0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
15ae0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
15af0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
15b00 39 2e 30 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c  9.0", 0) == NULL
15b10 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
15b20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
15b30 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  dif.    if (Tcl_
15b40 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72  PkgRequire(inter
15b50 70 2c 20 22 54 63 6c 22 2c 20 22 39 2e 30 2d 22  p, "Tcl", "9.0-"
15b60 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  , 0) == NULL) {.
15b70 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
15b80 52 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 23  R;.    }.#else.#
15b90 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  ifdef USE_TCL_ST
15ba0 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  UBS.    if (Tcl_
15bb0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
15bc0 2c 20 22 38 2e 35 22 2c 20 30 29 20 3d 3d 20 4e  , "8.5", 0) == N
15bd0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
15be0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15bf0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54  #endif.    if (T
15c00 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e  cl_PkgRequire(in
15c10 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e  terp, "Tcl", "8.
15c20 35 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29  5-", 0) == NULL)
15c30 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
15c40 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
15c50 69 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c  if..    if (TlsL
15c60 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c  ibInit(0) != TCL
15c70 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _OK) {..Tcl_Appe
15c80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15c90 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74   "could not init
15ca0 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61  ialize SSL libra
15cb0 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ry", NULL);..ret
15cc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15cd0 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72     }..    Tcl_Cr
15ce0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15cf0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70  nterp, "tls::cip
15d00 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62  hers", CiphersOb
15d10 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15d20 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
15d30 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15d40 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15d50 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15d60 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63  rp, "tls::connec
15d70 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f  tion", Connectio
15d80 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c  nInfoObjCmd, (Cl
15d90 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15da0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15db0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15dc0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15dd0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15de0 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
15df0 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43  dshakeObjCmd, (C
15e00 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
15e10 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15e20 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15e30 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15e40 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15e50 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
15e60 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
15e70 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
15e80 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15e90 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15ea0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15eb0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69  nterp, "tls::uni
15ec0 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
15ed0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15ee0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
15ef0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15f00 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15f10 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15f20 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74  terp, "tls::stat
15f30 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
15f40 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15f50 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
15f60 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15f70 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15f80 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15f90 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
15fa0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
15fb0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
15fc0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15fd0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15fe0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15ff0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
16000 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
16010 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
16020 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
16030 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
16040 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
16050 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
16060 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f  erp, "tls::proto
16070 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73  cols", Protocols
16080 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
16090 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
160a0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
160b0 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72  LL);..    Tcl_Cr
160c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
160d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 73  nterp, "tls::has
160e0 68 22 2c 20 48 61 73 68 43 6d 64 2c 20 28 43 6c  h", HashCmd, (Cl
160f0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
16100 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
16110 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
16120 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
16130 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
16140 3a 68 61 73 68 65 73 22 2c 20 48 61 73 68 4c 69  :hashes", HashLi
16150 73 74 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  stCmd, (ClientDa
16160 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
16170 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
16180 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
16190 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
161a0 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c  erp, "tls::md4",
161b0 20 48 61 73 68 4d 44 34 43 6d 64 2c 20 28 43 6c   HashMD4Cmd, (Cl
161c0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
161d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
161e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
161f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
16200 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
16210 3a 6d 64 35 22 2c 20 48 61 73 68 4d 44 35 43 6d  :md5", HashMD5Cm
16220 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
16230 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
16240 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
16250 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16260 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16270 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 48 61   "tls::sha1", Ha
16280 73 68 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 65  shSHA1Cmd, (Clie
16290 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
162a0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
162b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
162c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
162d0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73  (interp, "tls::s
162e0 68 61 32 35 36 22 2c 20 48 61 73 68 53 48 41 32  ha256", HashSHA2
162f0 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  56Cmd, (ClientDa
16300 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
16310 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
16320 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74  L);..    if (int
16330 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c  erp) {..Tcl_Eval
16340 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49  (interp, tlsTclI
16350 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20  nitScript);.    
16360 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  }..    return Tc
16370 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
16380 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d  erp, PACKAGE_NAM
16390 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  E, PACKAGE_VERSI
163a0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ON);.}../*. *---
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53  ---*. *. *.Tls_S
163f0 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  afeInit --. *. *
16400 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16430 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70  -*. *.Standard p
16440 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65  rocedure require
16450 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09  d by 'load'.. *.
16460 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73  Initializes this
16470 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61   extension for a
16480 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
16490 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.. *.----------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164c0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
164d0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
164e0 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  As of 'Tls_Init'
164f0 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
16500 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63  *..A standard Tc
16510 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  l error code.. *
16520 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44  ---------*. */.D
16560 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
16570 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
16580 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
16590 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
165a0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
165b0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72  n(Tls_Init(inter
165c0 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  p));.}../*. *---
165d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16600 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
16610 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
16620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16650 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
16660 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
16670 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
16680 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
16690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166b0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
166c0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
166d0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
166e0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
166f0 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
16700 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16730 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
16740 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
16750 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
16760 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
16770 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
16780 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
16790 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
167a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
167b0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
167c0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
167d0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
167e0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
167f0 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
16800 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20  itialize) {..if 
16810 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
16820 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
16830 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
16840 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65  lize, but we are
16850 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
16860 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e  ");...    return
16870 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64  (TCL_OK);..}...d
16880 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
16890 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b   uninitialize");
168a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
168b0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
168c0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
168d0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
168e0 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  xLock(&init_mx);
168f0 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a  ...if (locks) {.
16900 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29  .    free(locks)
16910 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e  ;..    locks = N
16920 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43  ULL;..    locksC
16930 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e  ount = 0;..}.#en
16940 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64  dif..initialized
16950 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 0;..#if defin
16960 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
16970 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
16980 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
16990 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e  _MutexUnlock(&in
169a0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a  it_mx);.#endif..
169b0 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
169c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
169d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
169e0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
169f0 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
16a00 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75  d value");..retu
16a10 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20  rn(status);.    
16a20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
16a30 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
16a40 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
16a50 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
16a60 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
16a70 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63      Tcl_MutexLoc
16a80 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
16a90 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69  dif.    initiali
16aa0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65  zed = 1;..#if de
16ab0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
16ac0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
16ad0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
16ae0 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31     num_locks = 1
16af0 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74  ;.    locksCount
16b00 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63   = (int) num_loc
16b10 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20  ks;.    locks = 
16b20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c  malloc(sizeof(*l
16b30 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b  ocks) * num_lock
16b40 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c  s);.    memset(l
16b50 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocks, 0, sizeof(
16b60 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f  *locks) * num_lo
16b70 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  cks);.#endif..  
16b80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
16b90 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61  BOTH libcrypto a
16ba0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20  nd libssl. */.  
16bb0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73    OPENSSL_init_s
16bc0 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  sl(OPENSSL_INIT_
16bd0 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53  LOAD_SSL_STRINGS
16be0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
16bf0 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49  LOAD_CRYPTO_STRI
16c00 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49  NGS..| OPENSSL_I
16c10 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48  NIT_ADD_ALL_CIPH
16c20 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  ERS | OPENSSL_IN
16c30 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53  IT_ADD_ALL_DIGES
16c40 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  TS, NULL);..    
16c50 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c  BIO_new_tcl(NULL
16c60 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  , 0);..#if 0.   
16c70 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54   /*.     * XXX:T
16c80 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
16c90 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63   code and replac
16ca0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63  e it with a chec
16cb0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f  k.     * for eno
16cc0 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20  ugh entropy and 
16cd0 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72  do not try to cr
16ce0 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20  eate our own.   
16cf0 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74    * terrible ent
16d00 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ropy.     */.   
16d10 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20   /*.     * Seed 
16d20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  the random numbe
16d30 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74  r generator in t
16d40 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a  he SSL library,.
16d50 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65       * using the
16d60 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72   do/while constr
16d70 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  uct because of t
16d80 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74  he bug note in t
16d90 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53  he.     * OpenSS
16da0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f  L FAQ at http://
16db0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f  www.openssl.org/
16dc0 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c  support/faq.html
16dd0 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20  #USER1.     *.  
16de0 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66     * The crux of
16df0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
16e00 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64  that Solaris 7 d
16e10 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20  oes not have a. 
16e20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f      * /dev/rando
16e30 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f  m or /dev/urando
16e40 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63  m device so it c
16e50 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f  annot gather eno
16e60 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f  ugh.     * entro
16e70 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44  py from the RAND
16e80 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53  _seed() when TLS
16e90 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64   initializes and
16ea0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20   refuses.     * 
16eb0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45  to go further. E
16ec0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
16ed0 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69  of OpenSSL carri
16ee0 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73  ed on regardless
16ef0 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72  ..     */.    sr
16f00 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  and((unsigned in
16f10 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20  t) time((time_t 
16f20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64  *) NULL));.    d
16f30 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b  o {..for (i = 0;
16f40 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a   i < 16; i++) {.
16f50 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d  .    rnd_seed[i]
16f60 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32   = 1 + (char) (2
16f70 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52  55.0 * rand()/(R
16f80 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09  AND_MAX+1.0));..
16f90 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64  }..RAND_seed(rnd
16fa0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e  _seed, sizeof(rn
16fb0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20  d_seed));.    } 
16fc0 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74  while (RAND_stat
16fd0 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64  us() != 1);.#end
16fe0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
16ff0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
17000 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
17010 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
17020 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
17030 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
17040 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a  turn(status);.}.