Hex Artifact Content

Artifact 8e541b360a7104018810b1312323d9da29726df6478dfa3c263043dde512066e:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63  ode, ok;..    Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72  with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61   ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20  lue 1, fail for 
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20  error or return 
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63  value 0 */.    c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20    ok = 1;..}.   
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72   } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65  ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43  .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0f10: 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a  r;.    char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b  or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10f0: 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28  ..#if 0.    if (
1100: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
1110: 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 53  LERT) {..sev = S
1120: 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74  SL_alert_type_st
1130: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a  ring_long(ret);.
1140: 09 69 66 20 28 73 74 72 63 6d 70 28 73 65 76 2c  .if (strcmp(sev,
1150: 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09   "fatal")==0) {.
1160: 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f 72 20  /* Map to error 
1170: 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  */..    Tls_Erro
1180: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f  r(statePtr, SSL_
1190: 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a  ERROR(ssl, 0));.
11a0: 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a  .    return;..}.
11b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
11c0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
11d0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53  L_CB_HANDSHAKE_S
11e0: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  TART) {..major =
11f0: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1200: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a  inor = "start";.
1210: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77      } else if (w
1220: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
1230: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a  NDSHAKE_DONE) {.
1240: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1250: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1260: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73  done";.    } els
1270: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26  e {..if (where &
1280: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09   SSL_CB_ALERT)..
1290: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b  major = "alert";
12a0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
12b0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43   & SSL_ST_CONNEC
12c0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e  T).major = "conn
12d0: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ect";..else if (
12e0: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41  where & SSL_ST_A
12f0: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20  CCEPT)..major = 
1300: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09  "accept";..else.
1310: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b  ....major = "unk
1320: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65  nown";...if (whe
1330: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44  re & SSL_CB_READ
1340: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64  )..minor = "read
1350: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1360: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54  re & SSL_CB_WRIT
1370: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69  E)..minor = "wri
1380: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  te";..else if (w
1390: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f  here & SSL_CB_LO
13a0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f  OP)..minor = "lo
13b0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  op";..else if (w
13c0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58  here & SSL_CB_EX
13d0: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78  IT)..minor = "ex
13e0: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  it";..else.....m
13f0: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  inor = "unknown"
1400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1410: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1420: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d  o eval */.    cm
1430: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
1440: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
1450: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
1460: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1470: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1480: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1490: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f  wStringObj("info
14a0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
14b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
14d0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
14e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
14f0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
1500: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
1510: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    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 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1550: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b  Obj(major, -1));
1560: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1570: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1580: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1590: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
15a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  inor, -1));..   
15b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
15c0: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63  _CB_ALERT) {..Tc
15d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
15e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
15f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
1600: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
1610: 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69  _alert_desc_stri
1620: 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31  ng_long(ret), -1
1630: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
1640: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1650: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1660: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1670: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79  Obj(SSL_alert_ty
1680: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  pe_string_long(r
1690: 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  et), -1));.    }
16a0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73   else {..Tcl_Lis
16b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
16c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
16d0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
16e0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74  ringObj(SSL_stat
16f0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
1700: 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  l), -1));..Tcl_L
1710: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1720: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1730: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1740: 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29  gObj("info", -1)
1750: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1760: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
1770: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
1780: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
1790: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
17a0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
17b0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
17c0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
17d0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
17e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1830: 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62  *. * VerifyCallb
1840: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
1850: 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66  itors SSL certif
1860: 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e  icate validation
1870: 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74   process. Used t
1880: 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a  o control the. *
1890: 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74  .behavior when t
18a0: 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45  he SSL_VERIFY_PE
18b0: 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ER flag is set. 
18c0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20  This is called. 
18d0: 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 72  *.whenever a cer
18e0: 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70  tificate is insp
18f0: 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 64  ected or decided
1900: 20 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20   invalid.. *. * 
1910: 43 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69  Checks:. *.certi
1920: 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20  ficate chain is 
1930: 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67  checked starting
1940: 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73   with the deepes
1950: 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a  t nesting level.
1960: 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43   *.  (the root C
1970: 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61  A certificate) a
1980: 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64  nd worked upward
1990: 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63   to the peer's c
19a0: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41  ertificate.. *.A
19b0: 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72  ll signatures ar
19c0: 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74  e valid, current
19d0: 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20   time is within 
19e0: 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76  first and last v
19f0: 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a  alidity time.. *
1a00: 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  .Check that the 
1a10: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
1a20: 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73  ssued by the iss
1a30: 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  uer certificate 
1a40: 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b  issuer.. *.Check
1a50: 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20   the revocation 
1a60: 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20  status for each 
1a70: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09  certificate.. *.
1a80: 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69  Check the validi
1a90: 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ty of the given 
1aa0: 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74  CRL and the cert
1ab0: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
1ac0: 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  us.. *.Check the
1ad0: 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c   policies of all
1ae0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
1af0: 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09  s. *. * Args. *.
1b00: 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64  preverify_ok ind
1b10: 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74  icates whether t
1b20: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76  he certificate v
1b30: 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73  erification pass
1b40: 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30  ed (1) or not (0
1b50: 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  ). *. * Results:
1b60: 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62  . *.A callback b
1b70: 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b  ound to the sock
1b80: 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e  et may return on
1b90: 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09  e of:. *.    0..
1ba0: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61  .- the certifica
1bb0: 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76  te is deemed inv
1bc0: 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66  alid, send verif
1bd0: 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20  ication. *....  
1be0: 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f  failure alert to
1bf0: 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69   peer, and termi
1c00: 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a  nate handshake..
1c10: 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65   *.    1...- the
1c20: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
1c30: 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f  deemed valid, co
1c40: 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64  ntinue with hand
1c50: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d  shake.. *.    em
1c60: 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20  pty string.- no 
1c70: 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66  change to certif
1c80: 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e  icate validation
1c90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1ca0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20  cts:. *.The err 
1cb0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
1cc0: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65  rently operative
1cd0: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a   State is set. *
1ce0: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64  .  to a string d
1cf0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53  escribing the SS
1d00: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61  L negotiation fa
1d10: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a  ilure reason. *.
1d20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
1d70: 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62   int.VerifyCallb
1d80: 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39  ack(int ok, X509
1d90: 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29  _STORE_CTX *ctx)
1da0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
1db0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20  cmdPtr;.    SSL 
1dc0: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29    *ssl..= (SSL*)
1dd0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
1de0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20  et_ex_data(ctx, 
1df0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f  SSL_get_ex_data_
1e00: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69  X509_STORE_CTX_i
1e10: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20  dx());.    X509 
1e20: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53   *cert..= X509_S
1e30: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72  TORE_CTX_get_cur
1e40: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a  rent_cert(ctx);.
1e50: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
1e60: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr.= (State*)SS
1e70: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_get_app_data(s
1e80: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  sl);.    Tcl_Int
1e90: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
1ea0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
1eb0: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d      int depth..=
1ec0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
1ed0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28  get_error_depth(
1ee0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72  ctx);.    int er
1ef0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  r..= X509_STORE_
1f00: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74  CTX_get_error(ct
1f10: 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  x);..    dprintf
1f20: 28 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f  ("Verify: %d", o
1f30: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  k);..    if (sta
1f40: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
1f50: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
1f60: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
1f70: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52  vflags & SSL_VER
1f80: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
1f90: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
1fa0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65   return ok;..} e
1fb0: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
1fc0: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  n 1;..}.    }.. 
1fd0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
1fe0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
1ff0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2000: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2010: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
2020: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2030: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2040: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2050: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
2060: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rify", -1));.   
2070: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2080: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2090: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
20a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
20b0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
20c0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2110: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63  (depth));.    Tc
2120: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2130: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2140: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35  mdPtr, Tls_NewX5
2150: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65  09Obj(interp, ce
2160: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  rt));.    Tcl_Li
2170: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2180: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2190: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
21a0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  (ok));.    Tcl_L
21b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
21c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
21d0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
21e0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30  ngObj((char*)X50
21f0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
2200: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
2210: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 73 74 61 74   -1));..    stat
2220: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
2230: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b  LS_TCL_CALLBACK;
2240: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2250: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2260: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2270: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2280: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2290: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
22a0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
22b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
22c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
22d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
22e0: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c  ags &= ~(TLS_TCL
22f0: 5f 43 41 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _CALLBACK);.    
2300: 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42  return(ok);./* B
2310: 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65  y default, leave
2320: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e   verification un
2330: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a  changed. */.}...
2340: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2390: 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20  ls_Error --. *. 
23a0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
23b0: 20 77 69 74 68 20 24 66 64 20 61 6e 64 20 24 6d   with $fd and $m
23c0: 73 67 20 2d 20 73 6f 20 74 68 65 20 63 61 6c 6c  sg - so the call
23d0: 62 61 63 6b 20 63 61 6e 20 64 65 63 69 64 65 0a  back can decide.
23e0: 20 2a 09 77 68 61 74 20 74 6f 20 64 6f 20 77 69   *.what to do wi
23f0: 74 68 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a  th errors.. *. *
2400: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2410: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2420: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2430: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
2440: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
2450: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
2460: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2470: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2480: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24d0: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
24e0: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
24f0: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b  tr, char *msg) {
2500: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2510: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
2520: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
2530: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
2540: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
2550: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
2560: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
2570: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
2580: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
2590: 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 20 26 26  ..    if (msg &&
25a0: 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65   *msg) {..Tcl_Se
25b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
25c0: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28  p, "SSL", msg, (
25d0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20  char *)NULL);.  
25e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20    } else {..msg 
25f0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
2600: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  romObj(Tcl_GetOb
2610: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  jResult(interp),
2620: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20   NULL);.    }.  
2630: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
2640: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  = msg;..    /* C
2650: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
2660: 20 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62   eval from callb
2670: 61 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  ack */.    cmdPt
2680: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2690: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
26a0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
26b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
26c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
26d0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
26e0: 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c  ringObj("error",
26f0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2700: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2710: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2720: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
2730: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
2740: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
2750: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
2760: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2770: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2780: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2790: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
27a0: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20  j(msg, -1));..  
27b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
27c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
27d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
27e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
27f0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2800: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2810: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2820: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2830: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43  --. *. * KeyLogC
2890: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
28a0: 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20  .Write received 
28b0: 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20  key data to log 
28c0: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  file.. *. * Side
28d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
28e0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
2930: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  oid KeyLogCallba
2940: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
2950: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  l, const char *l
2960: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20  ine) {.    char 
2970: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53  *str = getenv(SS
2980: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20  LKEYLOGFILE);.  
2990: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20    FILE *fd;.    
29a0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d  if (str) {..fd =
29b0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29   fopen(str, "a")
29c0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22  ;..fprintf(fd, "
29d0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63  %s\n",line);..fc
29e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
29f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2a40: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c   * Password Call
2a50: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  back --. *. *.Ca
2a60: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
2a70: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74  word is needed t
2a80: 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64  o unpack RSA and
2a90: 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76   PEM keys.. *.Ev
2aa0: 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61  als any bound pa
2ab0: 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e  ssword script an
2ac0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
2ad0: 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70  sult as. *.the p
2ae0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a  assword string..
2af0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
2b40: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
2b50: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
2b60: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
2b70: 74 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a  t verify, void *
2b80: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
2b90: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
2ba0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
2bb0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
2bc0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
2bd0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
2be0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
2bf0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20      int code;.. 
2c00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2c10: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
2c20: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
2c30: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  d == NULL) {..if
2c40: 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74   (Tcl_EvalEx(int
2c50: 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77  erp, "tls::passw
2c60: 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56  ord", -1, TCL_EV
2c70: 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43  AL_GLOBAL) == TC
2c80: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61  L_OK) {..    cha
2c90: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a  r *ret = (char *
2ca0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  ) Tcl_GetStringR
2cb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
2cc0: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c      strncpy(buf,
2cd0: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73   ret, (size_t) s
2ce0: 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ize);..    retur
2cf0: 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65  n (int)strlen(re
2d00: 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  t);..} else {.. 
2d10: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d     return -1;..}
2d20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2d30: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
2d40: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
2d50: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
2d60: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
2d70: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20  >password);..   
2d80: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
2d90: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
2da0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
2db0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
2dc0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
2dd0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
2de0: 63 6b 20 61 6e 64 20 73 75 63 63 65 73 73 20 66  ck and success f
2df0: 6f 72 20 6f 6b 2c 20 61 62 6f 72 74 20 66 6f 72  or ok, abort for
2e00: 20 65 72 72 6f 72 2c 20 63 6f 6e 74 69 6e 75 65   error, continue
2e10: 20 66 6f 72 20 63 6f 6e 74 69 6e 75 65 20 2a 2f   for continue */
2e20: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2e30: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2e40: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
2e50: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
2e60: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
2e70: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66  _GLOBAL);.    if
2e80: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
2e90: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
2ea0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
2eb0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
2ec0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
2ed0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2ee0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
2ef0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
2f00: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
2f10: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
2f20: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
2f30: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2f40: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
2f50: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
2f60: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
2f70: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
2f80: 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 2a 72 65  _OK) {..char *re
2f90: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
2fa0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
2fb0: 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 73  (interp);..if (s
2fc0: 74 72 6c 65 6e 28 72 65 74 29 20 3c 20 73 69 7a  trlen(ret) < siz
2fd0: 65 20 2d 20 31 29 20 7b 0a 09 20 20 20 20 73 74  e - 1) {..    st
2fe0: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20  rncpy(buf, ret, 
2ff0: 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a  (size_t) size);.
3000: 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
3010: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3020: 74 65 72 70 29 3b 0a 09 20 20 20 20 72 65 74 75  terp);..    retu
3030: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72  rn (int)strlen(r
3040: 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  et);..}.    }.  
3050: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
3060: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
3070: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  p);.    return -
3080: 31 3b 0a 09 76 65 72 69 66 79 20 3d 20 76 65 72  1;..verify = ver
3090: 69 66 79 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ify;.}.../*. *--
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20  -. *. * Session 
30f0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
3100: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  ents --. *. *.Ca
3110: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
3120: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64  session is added
3130: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49   to the cache. I
3140: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69  n TLS 1.3. *.thi
3150: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65  s may be receive
3160: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
3170: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73   after the hands
3180: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72  hake. For. *.ear
3190: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74  lier versions, t
31a0: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65  his will be rece
31b0: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  ived during the 
31c0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68  handshake.. *.Th
31d0: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72  is is the prefer
31e0: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69  red way to obtai
31f0: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65  n a resumable se
3200: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ssion.. *. * Res
3210: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
3220: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3230: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
3240: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
3250: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
3260: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f  des:. *.0 = erro
3270: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20  r where session 
3280: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74  will be immediat
3290: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  ely removed from
32a0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
32b0: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63  che.. *.1 = succ
32c0: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65  ess where app re
32d0: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e  tains session in
32e0: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20   session cache, 
32f0: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53  and must call SS
3300: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29  L_SESSION_free()
3310: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20   when done.. *. 
3320: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3360: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3370: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62  int.SessionCallb
3380: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
3390: 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  sl, SSL_SESSION 
33a0: 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20  *session) {.    
33b0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
33c0: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
33d0: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20  t_app_data((SSL 
33e0: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  *)ssl);.    Tcl_
33f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
3400: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
3410: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
3420: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  cmdPtr;.    cons
3430: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3440: 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e  *ticket;.    con
3450: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3460: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20   *session_id;.  
3470: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20    size_t len2;. 
3480: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
3490: 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ulen;..    dprin
34a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
34b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
34c0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
34d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
34e0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
34f0: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
3500: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
3510: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3520: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
3530: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
3540: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3550: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
3560: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
3570: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3580: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3590: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
35a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
35b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
35c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
35d0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
35e0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
35f0: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
3600: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
3610: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
3620: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
3630: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3640: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3650: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
3660: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
3670: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c  ion_id, (int) ul
3680: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
3690: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
36a0: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
36b0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
36c0: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
36d0: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
36e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
36f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3700: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
3710: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
3720: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  int) len2));..  
3730: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
3740: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
3750: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
3760: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3770: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3780: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
3790: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
37a0: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
37b0: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
37c0: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
37d0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
37e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
37f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
3800: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
3810: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
3820: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
3830: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
3840: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3860: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
38b0: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63  . * ALPN Callbac
38c0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e  k for Servers an
38d0: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66  d NPN Callback f
38e0: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
38f0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74  . *.Perform prot
3900: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
3910: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65  h2, h3, etc.) se
3920: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  lection for the.
3930: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e   *.incoming conn
3940: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61  ection. Called a
3950: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73  fter Hello and s
3960: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  erver callbacks.
3970: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20  . *.Where 'out' 
3980: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  is selected prot
3990: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73  ocol and 'in' is
39a0: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74   the peer advert
39b0: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ised list.. *. *
39c0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
39d0: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
39e0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
39f0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
3a00: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
3a10: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
3a20: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41  TLSEXT_ERR_OK: A
3a30: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  LPN protocol sel
3a40: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
3a50: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
3a60: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
3a70: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
3a80: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65  There was no ove
3a90: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65  rlap between the
3aa0: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20   client's. *.   
3ab0: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61   supplied list a
3ac0: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f  nd the server co
3ad0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65  nfiguration. The
3ae0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
3af0: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09   be aborted.. *.
3b00: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
3b10: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  OACK: ALPN proto
3b20: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
3b30: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20  , e.g., because 
3b40: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70  no ALPN. *.    p
3b50: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e  rotocols are con
3b60: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
3b70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
3b80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
3b90: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3be0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41   */.static int.A
3bf0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LPNCallback(cons
3c00: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
3c10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3c20: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
3c30: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
3c40: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3c50: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
3c60: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
3c70: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
3c80: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
3c90: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
3ca0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3cb0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
3cc0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
3cd0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
3ce0: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
3cf0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3d00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3d10: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
3d20: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
3d30: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
3d40: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
3d50: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
3d60: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
3d70: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
3d80: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20  next_proto(out, 
3d90: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
3da0: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
3db0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
3dc0: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
3dd0: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
3de0: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74  IATED) {../* Mat
3df0: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73  ch found */..res
3e00: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
3e10: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
3e20: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e   {../* OPENSSL_N
3e30: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20  PN_NO_OVERLAP = 
3e40: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
3e50: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72  se first item fr
3e60: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63  om client protoc
3e70: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20  ol list */..res 
3e80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
3e90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
3ea0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
3eb0: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
3ec0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
3ed0: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20  rn res;.    }.. 
3ee0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3ef0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
3f00: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3f10: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3f20: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
3f30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3f40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3f50: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3f60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
3f70: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
3f80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3f90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3fa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3fb0: 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d  tringObj(*out, -
3fc0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
3fd0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3fe0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3ff0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4000: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
4010: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
4020: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4030: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
4040: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
4050: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4060: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
4070: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
4080: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4090: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
40a0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
40b0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
40c0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATAL;.    }.    
40d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
40e0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
40f0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
4100: 0a 20 2a 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 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76  ------. *. * Adv
4150: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73  ertise Protocols
4160: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65   Callback for Ne
4170: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  xt Protocol Nego
4180: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e  tiation (NPN) in
4190: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a   ServerHello --.
41a0: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65   *. *.called whe
41b0: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e  n a TLS server n
41c0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73  eeds a list of s
41d0: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f  upported protoco
41e0: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50  ls for Next. *.P
41f0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
4200: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
4210: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4220: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4230: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4240: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4250: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72  T_ERR_OK: NPN pr
4260: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
4270: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4280: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
4290: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
42a0: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c  CK: NPN protocol
42b0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54   not selected. T
42c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
42d0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  -. */.#ifdef USE
4330: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a  _NPN.static int.
4340: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  NPNCallback(cons
4350: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
4360: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4370: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4380: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69  int *outlen, voi
4390: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
43a0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
43b0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20  (State*)arg;..  
43c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
43d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
43e0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
43f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
4400: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4410: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4420: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74  .    /* Set prot
4430: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20  ocols list */.  
4440: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4450: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
4460: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50  {..*out = stateP
4470: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75  tr->protos;..*ou
4480: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d  tlen = statePtr-
4490: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20  >protos_len;.   
44a0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20   } else {..*out 
44b0: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e  = NULL;..*outlen
44c0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53   = 0;..return SS
44d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
44e0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  CK;.    }.    re
44f0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4500: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ERR_OK;.}.#endif
4510: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
4520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4560: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66  * SNI Callback f
4570: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
4580: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76  . *.Perform serv
4590: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74  er-side SNI host
45a0: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61  name selection a
45b0: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53  fter receiving S
45c0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  NI extension. *.
45d0: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e  in Client Hello.
45e0: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65   Called after he
45f0: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74  llo callback but
4600: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c   before ALPN cal
4610: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
4620: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
4630: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4640: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
4650: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4660: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4670: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
4680: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68  XT_ERR_OK: SNI h
4690: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70  ostname is accep
46a0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
46b0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
46c0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
46d0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e  _ALERT_FATAL: SN
46e0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
46f0: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  t accepted. The 
4700: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20  connection. *.  
4710: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65    is aborted. De
4720: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20  fault for alert 
4730: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f  is SSL_AD_UNRECO
4740: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09  GNIZED_NAME.. *.
4750: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4760: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e  LERT_WARNING: SN
4770: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
4780: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e  t accepted, warn
4790: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20  ing alert. *.   
47a0: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f   sent (not suppo
47b0: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29  rted in TLSv1.3)
47c0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
47d0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
47e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
47f0: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ACK: SNI hostnam
4800: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
4810: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77  d and not acknow
4820: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65  ledged,. *.    e
4830: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e  .g. if SNI has n
4840: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  ot been configur
4850: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
4860: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
4870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
48c0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63  c int.SNICallbac
48d0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
48e0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
48f0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
4900: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4910: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
4920: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4930: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4940: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4950: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4960: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
4970: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
4980: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
4990: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
49a0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
49b0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
49c0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
49d0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
49e0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
49f0: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f  ..    /* Only wo
4a00: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20  rks for TLS 1.2 
4a10: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20  and earlier */. 
4a20: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20     servername = 
4a30: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
4a40: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
4a50: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
4a60: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72  e);.    if (!ser
4a70: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65  vername || serve
4a80: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27  rname[0] == '\0'
4a90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4aa0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4ab0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
4ac0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
4ad0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
4ae0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4af0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
4b00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4b10: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
4b20: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
4b30: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
4b40: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
4b50: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
4b60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4b70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4b80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4b90: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
4ba0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4bb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4bc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4bd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4be0: 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29  servername , -1)
4bf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
4c00: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
4c10: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
4c20: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
4c30: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20  ;.    if ((code 
4c40: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
4c50: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
4c60: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b   cmdPtr)) > 1) {
4c70: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
4c80: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
4c90: 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  NING;..*alert = 
4ca0: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
4cb0: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74  ZED_NAME; /* Not
4cc0: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c   supported by TL
4cd0: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65  S 1.3 */.    } e
4ce0: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
4cf0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
4d00: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4d10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
4d20: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4d30: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09  R_ALERT_FATAL;..
4d40: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f  *alert = SSL_AD_
4d50: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
4d60: 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72  E; /* Not suppor
4d70: 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a  ted by TLS 1.3 *
4d80: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  /.    }.    Tcl_
4d90: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
4da0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
4db0: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e00: 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48  --. *. * ClientH
4e10: 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43  ello Handshake C
4e20: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
4e30: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65  ers --. *. *.Use
4e40: 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65  d by server to e
4e50: 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65  xamine the serve
4e60: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
4e70: 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f  n (SNI) extensio
4e80: 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79  n. *.provided by
4e90: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f   the client in o
4ea0: 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61  rder to select a
4eb0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65  n appropriate ce
4ec0: 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09  rtificate to. *.
4ed0: 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b  present, and mak
4ee0: 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72  e other configur
4ef0: 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74  ation adjustment
4f00: 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68  s relevant to th
4f10: 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d  at server. *.nam
4f20: 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67  e and its config
4f30: 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e  uration. This in
4f40: 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20  cludes swapping 
4f50: 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  out the associat
4f60: 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f  ed. *.SSL_CTX po
4f70: 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67  inter, modifying
4f80: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69   the server's li
4f90: 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20  st of permitted 
4fa0: 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a  TLS versions,. *
4fb0: 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65  .changing the se
4fc0: 72 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69  rver's cipher li
4fd0: 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  st in response t
4fe0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63  o the client's c
4ff0: 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e  ipher list, etc.
5000: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72  . *.Called befor
5010: 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63  e SNI and ALPN c
5020: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20  allbacks.. *. * 
5030: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
5040: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5050: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
5060: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
5070: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
5080: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43   codes:. *.SSL_C
5090: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
50a0: 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65 20 68  Y: suspend the h
50b0: 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68  andshake, and th
50c0: 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63  e handshake func
50d0: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e  tion will return
50e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09   immediately. *.
50f0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
5100: 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c  _ERROR: failure,
5110: 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65   terminate conne
5120: 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74  ction. Set alert
5130: 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   to error code..
5140: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
5150: 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63  LLO_SUCCESS: suc
5160: 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  cess. *. *------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
51b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c  /.static int.Hel
51c0: 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  loCallback(const
51d0: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a   SSL *ssl, int *
51e0: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67  alert, void *arg
51f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
5200: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
5210: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
5220: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
5230: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
5240: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
5250: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
5260: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f  ode, res;.    co
5270: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72  nst char *server
5280: 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  name;.    const 
5290: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
52a0: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ;.    size_t len
52b0: 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20  , remaining;..  
52c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
52d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
52e0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
52f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
5300: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
5310: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
5320: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  SS;.    } else i
5330: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c  f (ssl == NULL |
5340: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | arg == NULL) {
5350: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
5360: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
5370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
5380: 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  et names */.    
5390: 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f  if (!SSL_client_
53a0: 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73  hello_get0_ext(s
53b0: 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f  sl, TLSEXT_TYPE_
53c0: 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c  server_name, &p,
53d0: 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20   &remaining) || 
53e0: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20  remaining <= 2) 
53f0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
5400: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
5410: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
5420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
5430: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
5440: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
5450: 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74  xtract the lengt
5460: 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  h of the supplie
5470: 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e  d list of names.
5480: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a   */.    len = (*
5490: 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20  (p++) << 8);.   
54a0: 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a   len += *(p++);.
54b0: 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20      if (len + 2 
54c0: 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a  != remaining) {.
54d0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
54e0: 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45  SSLV3_ALERT_ILLE
54f0: 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09  GAL_PARAMETER;..
5500: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
5510: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
5520: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
5530: 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f  ng = len;..    /
5540: 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72  * The list in pr
5550: 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20  actice only has 
5560: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74  a single element
5570: 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e  , so we only con
5580: 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20  sider the first 
5590: 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  one. */.    if (
55a0: 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c  remaining == 0 |
55b0: 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54  | *p++ != TLSEXT
55c0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
55d0: 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  ame) {..*alert =
55e0: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
55f0: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
5600: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
5610: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
5620: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
5630: 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f  aining--;..    /
5640: 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e  * Now we can fin
5650: 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68  ally pull out th
5660: 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74  e byte array wit
5670: 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73  h the actual hos
5680: 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66  tname. */.    if
5690: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32   (remaining <= 2
56a0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
56b0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
56c0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
56d0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
56e0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
56f0: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
5700: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
5710: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
5720: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
5730: 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b  2 > remaining) {
5740: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
5750: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
5760: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
5770: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
5780: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
5790: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
57a0: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76   = len;.    serv
57b0: 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  ername = (const 
57c0: 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f  char *)p;..    /
57d0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
57e0: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
57f0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
5800: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
5810: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
5820: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5830: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5840: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
5850: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22  tringObj("hello"
5860: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5870: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5880: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5890: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
58a0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
58b0: 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a  , (int) len));..
58c0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
58d0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
58e0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
58f0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5900: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
5910: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
5920: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
5930: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
5940: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
5950: 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c  ELLO_RETRY;..*al
5960: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
5970: 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e  1_ALERT_USER_CAN
5980: 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c  CELLED;.    } el
5990: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
59a0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
59b0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
59c0: 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ESS;.    } else 
59d0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49  {..res = SSL_CLI
59e0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
59f0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
5a00: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
5a10: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  ERNAL_ERROR;.   
5a20: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
5a30: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5a40: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
5a50: 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43  **********/./* C
5a70: 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20  ommands         
5a80: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72  ---. *. * Cipher
5af0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
5b00: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72  available cipher
5b10: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  s. *. *.This pro
5b20: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
5b30: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
5b40: 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20   "tls::ciphers" 
5b50: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69  command. *.to li
5b60: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
5b70: 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e  hers, based upon
5b80: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
5b90: 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ed.. *. * Result
5ba0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
5bb0: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74   Tcl result list
5bc0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
5bd0: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75  ects:. *.constru
5be0: 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73  cts and destroys
5bf0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
5c00: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5c50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5c60: 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d  r *protocols[] =
5c70: 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c   {.."ssl2", "ssl
5c80: 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73  3", "tls1", "tls
5c90: 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20  1.1", "tls1.2", 
5ca0: 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d  "tls1.3", NULL.}
5cb0: 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20  ;.enum protocol 
5cc0: 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20  {.    TLS_SSL2, 
5cd0: 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c  TLS_SSL3, TLS_TL
5ce0: 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20  S1, TLS_TLS1_1, 
5cf0: 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f  TLS_TLS1_2, TLS_
5d00: 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45  TLS1_3, TLS_NONE
5d10: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  .};..static int.
5d20: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c  CiphersObjCmd(Cl
5d30: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
5d40: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
5d50: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
5d60: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
5d70: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
5d80: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20  Tcl_Obj *objPtr 
5d90: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f  = NULL;.    SSL_
5da0: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
5db0: 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20  .    SSL *ssl = 
5dc0: 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f  NULL;.    STACK_
5dd0: 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a  OF(SSL_CIPHER) *
5de0: 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70  sk;.    char *cp
5df0: 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20  , buf[BUFSIZ];. 
5e00: 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65     int index, ve
5e10: 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73  rbose = 0, use_s
5e20: 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20  upported = 0;.. 
5e30: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
5e40: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28  ed");..    if ((
5e50: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62  objc < 2) || (ob
5e60: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f  jc > 4)) {..Tcl_
5e70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5e80: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70  erp, 1, objv, "p
5e90: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65  rotocol ?verbose
5ea0: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b  ? ?supported?");
5eb0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5ec0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
5ed0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
5ee0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
5ef0: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73  jv[1], protocols
5f00: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c  , "protocol", 0,
5f10: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f   &index) != TCL_
5f20: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
5f30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
5f40: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32     if ((objc > 2
5f50: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
5f60: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
5f70: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72  p, objv[2], &ver
5f80: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  bose) != TCL_OK)
5f90: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
5fa0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
5fb0: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26  if ((objc > 3) &
5fc0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
5fd0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
5fe0: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75  objv[3], &use_su
5ff0: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f  pported) != TCL_
6000: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
6010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6020: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
6030: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74  ror();..    swit
6040: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63  ch ((enum protoc
6050: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73  ol)index) {..cas
6060: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20  e TLS_SSL2:.#if 
6070: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
6080: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
6090: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
60a0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
60b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
60c0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41  SSL2)..    Tcl_A
60d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
60e0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
60f0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
6100: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
6110: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  , NULL);..    re
6120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6130: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d  #else..    ctx =
6140: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c   SSL_CTX_new(SSL
6150: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  v2_method()); br
6160: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
6170: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20  e TLS_SSL3:.#if 
6180: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
6190: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
61a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20  SSL_NO_SSL3) || 
61b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
61c0: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
61d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
61e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
61f0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
6200: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
6210: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
6220: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
6230: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
6240: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
6250: 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74  TX_new(SSLv3_met
6260: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
6270: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
6280: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
6290: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
62a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
62b0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
62c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
62d0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
62e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
62f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
6300: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
6310: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
6320: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
6330: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6340: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63  OR;.#else..    c
6350: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
6360: 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29  (TLSv1_method())
6370: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
6380: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31  .case TLS_TLS1_1
6390: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
63a0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
63b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
63c0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
63d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
63e0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  1_1_METHOD)..   
63f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6400: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
6410: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
6420: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
6430: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
6440: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6450: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
6460: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
6470: 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f  ew(TLSv1_1_metho
6480: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  d()); break;.#en
6490: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
64a0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_2:.#if define
64b0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
64c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
64d0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
64e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
64f0: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
6500: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6510: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
6520: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
6530: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
6540: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
6550: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
6560: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
6570: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
6580: 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d  TX_new(TLSv1_2_m
6590: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
65a0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
65b0: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65  S_TLS1_3:.#if de
65c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
65d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
65e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
65f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
6610: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
6620: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
6630: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
6640: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
6650: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
6660: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
6670: 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64  X_new(TLS_method
6680: 28 29 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  ());..    SSL_CT
6690: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
66a0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
66b0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20  1_3_VERSION);.. 
66c0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
66d0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
66e0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
66f0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61  SION);..    brea
6700: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75  k;.#endif..defau
6710: 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  lt:..    break;.
6720: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74      }.    if (ct
6730: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  x == NULL) {..Tc
6740: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6750: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c  nterp, REASON(),
6760: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
6770: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6780: 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f  ..    ssl = SSL_
6790: 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66  new(ctx);.    if
67a0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ssl == NULL) {
67b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
67c0: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f  lt(interp, REASO
67d0: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  N(), NULL);..SSL
67e0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
67f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6800: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6810: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
6820: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
6830: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
6840: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
6850: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
6860: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
6870: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
6880: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
6890: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
68a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
68b0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
68c0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
68d0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
68e0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
68f0: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62  rbose) {..    ob
6900: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
6910: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
6920: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
6930: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
6940: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
6950: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
6960: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
6970: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
6980: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
6990: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
69a0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68  inue;..../* ciph
69b0: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45  er name or (NONE
69c0: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f  ) */...cp = SSL_
69d0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
69e0: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20  c);...if (cp == 
69f0: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54  NULL) break;...T
6a00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6a10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6a20: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
6a30: 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29  tringObj(cp, -1)
6a40: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c  );..    }...} el
6a50: 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72  se {..    objPtr
6a60: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
6a70: 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20  Obj("",0);..    
6a80: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
6a90: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  i < sk_SSL_CIPHE
6aa0: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20  R_num(sk); i++) 
6ab0: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49  {...const SSL_CI
6ac0: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c  PHER *c = sk_SSL
6ad0: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b  _CIPHER_value(sk
6ae0: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d  , i);...if (c ==
6af0: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b   NULL) continue;
6b00: 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64  ..../* textual d
6b10: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
6b20: 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66  e cipher */...if
6b30: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73   (SSL_CIPHER_des
6b40: 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c  cription(c, buf,
6b50: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
6b60: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54   NULL) {...    T
6b70: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f  cl_AppendToObj(o
6b80: 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74  bjPtr, buf, (int
6b90: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a  ) strlen(buf));.
6ba0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
6bb0: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
6bc0: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57  (objPtr, "UNKNOW
6bd0: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20  N\n", 8);...}.. 
6be0: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65     }..}..if (use
6bf0: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20  _supported) {.. 
6c00: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52     sk_SSL_CIPHER
6c10: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20  _free(sk);..}.  
6c20: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65    }.    SSL_free
6c30: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43  (ssl);.    SSL_C
6c40: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20  TX_free(ctx);.. 
6c50: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
6c60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
6c70: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
6c80: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
6c90: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
6ca0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6cf0: 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  *. * ProtocolsOb
6d00: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61  jCmd -- list ava
6d10: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
6d20: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
6d30: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
6d40: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
6d50: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  "tls::protocols"
6d60: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
6d70: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72  ist available pr
6d80: 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52  otocols.. *. * R
6d90: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
6da0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
6db0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
6dc0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
6dd0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6e20: 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f  static int.Proto
6e30: 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  colsObjCmd(Clien
6e40: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
6e50: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
6e60: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
6e70: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
6e80: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
6e90: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
6ea0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
6eb0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
6ec0: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
6ed0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6ee0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6ef0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
6f00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6f10: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
6f20: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
6f30: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  L);..#if OPENSSL
6f40: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
6f50: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
6f60: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
6f70: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
6f80: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
6f90: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6fa0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6fb0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
6fc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
6fd0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32  otocols[TLS_SSL2
6fe0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
6ff0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
7000: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
7010: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
7020: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
7030: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
7040: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
7050: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7060: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
7070: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
7080: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
7090: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL3], -1));.
70a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
70b0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
70c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
70d0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
70e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
70f0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
7100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
7120: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
7130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
7140: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c  ocols[TLS_TLS1],
7150: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
7160: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
7170: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
7180: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7190: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
71a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
71b0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  _1_METHOD).    T
71c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
71d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
71e0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
71f0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
7200: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20  ls[TLS_TLS1_1], 
7210: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
7220: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
7230: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
7240: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7250: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
7260: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7270: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  2_METHOD).    Tc
7280: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7290: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
72a0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
72b0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
72c0: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d  s[TLS_TLS1_2], -
72d0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
72e0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
72f0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
7300: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7310: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  3).    Tcl_ListO
7320: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7330: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
7340: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7350: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
7360: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_3], -1));.#e
7370: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ndif..    Tcl_Se
7380: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7390: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
73a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
73b0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
73c0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
73d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7410: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64  -----. *. * Hand
7420: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20  shakeObjCmd --. 
7430: 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e  *. *.This comman
7440: 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72  d is used to ver
7450: 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ify whether the 
7460: 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d  handshake is com
7470: 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e  plete. *.or not.
7480: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
7490: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
74a0: 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e  l result. 1 mean
74b0: 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70  s handshake comp
74c0: 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65  lete, 0 means pe
74d0: 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64  nding.. *. * Sid
74e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
74f0: 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f  y force SSL nego
7500: 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20  tiation to take 
7510: 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  place.. *. *----
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7560: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48   */.static int H
7570: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43  andshakeObjCmd(C
7580: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
7590: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
75a0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
75b0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
75c0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
75d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
75e0: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n;        /* The
75f0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
7600: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
7610: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
7620: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69  r;        /* cli
7630: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
7640: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
7650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53  const char *errS
7660: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  tr = NULL;.    i
7670: 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20  nt ret = 1;.    
7680: 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20  int err = 0;..  
7690: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
76a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
76b0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
76c0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
76d0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
76e0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
76f0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
7700: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
7710: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
7720: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
7730: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7740: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c  [1], NULL), NULL
7750: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
7760: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
7770: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
7780: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
7790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
77a0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
77b0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
77c0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
77d0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
77e0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
77f0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
7800: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
7810: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
7820: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
7830: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7840: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
7850: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
7860: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22  lName(chan), "\"
7870: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
7880: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  nel", NULL);..re
7890: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
78a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
78b0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
78c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
78d0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
78e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
78f0: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46  alling Tls_WaitF
7900: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20  orConnect");.   
7910: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46   ret = Tls_WaitF
7920: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
7930: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20  tr, &err, 1);.  
7940: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57    dprintf("Tls_W
7950: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65  aitForConnect re
7960: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74  turned: %i", ret
7970: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20  );..    if (ret 
7980: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74  < 0 && ((statePt
7990: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
79a0: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72  CL_ASYNC) && (er
79b0: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b  r == EAGAIN))) {
79c0: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63  ..dprintf("Async
79d0: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45   set and err = E
79e0: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20  AGAIN");..ret = 
79f0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  0;.    } else if
7a00: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72   (ret < 0) {..er
7a10: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
7a20: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
7a30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
7a40: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
7a50: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
7a60: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d  r || (*errStr ==
7a70: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53   0)) {..    errS
7a80: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72  tr = Tcl_PosixEr
7a90: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ror(interp);..}.
7aa0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7ab0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
7ac0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
7ad0: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a   errStr, (char *
7ae0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
7af0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
7b00: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
7b10: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
7b20: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
7b30: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
7b40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
7b50: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20   (err != 0) {.. 
7b60: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
7b70: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20  an error with a 
7b80: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68  completed handsh
7b90: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20  ake: err = %i", 
7ba0: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20  err);..}..ret = 
7bb0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  1;.    }..    dp
7bc0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
7bd0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
7be0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
7bf0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
7c00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
7c10: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
7c20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43  );.    return(TC
7c30: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61  L_OK);..clientDa
7c40: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
7c50: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7ca0: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   * ImportObjCmd 
7cb0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
7cc0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
7cd0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
7ce0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a  e "ssl" command.
7cf0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f   *. *.The ssl co
7d00: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c  mmand pushes SSL
7d10: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63   over a (newly c
7d20: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f  onnected) tcp so
7d30: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cket. *. * Resul
7d40: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
7d50: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
7d60: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
7d70: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
7d80: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
7d90: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
7da0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
7df0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a  ic int.ImportObj
7e00: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
7e10: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
7e20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
7e30: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
7e40: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
7e50: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
7e60: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
7e70: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
7e80: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
7e90: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
7ea0: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
7eb0: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
7ec0: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  t */.    SSL_CTX
7ed0: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20   *ctx.        = 
7ee0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
7ef0: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20  j *script.      
7f00: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63    = NULL;.    Tc
7f10: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09  l_Obj *password.
7f20: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7f30: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d      Tcl_Obj *vcm
7f40: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
7f50: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
7f60: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  g upperChannelTr
7f70: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72  anslation, upper
7f80: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c  ChannelBlocking,
7f90: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63   upperChannelEnc
7fa0: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  oding, upperChan
7fb0: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20  nelEOFChar;.    
7fc0: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20  int idx, len;.  
7fd0: 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20    int flags..   
7fe0: 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49       = TLS_TCL_I
7ff0: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72  NIT;.    int ser
8000: 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30  ver..        = 0
8010: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69  ;./* is connecti
8020: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f  on incoming or o
8030: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20  utgoing? */.    
8040: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20  char *keyfile.  
8050: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8060: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
8070: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8080: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
8090: 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c  ar *key  .= NULL
80a0: 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65  ;.    int key_le
80b0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
80c0: 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67    = 0;.    unsig
80d0: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20  ned char *cert  
80e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
80f0: 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20     int cert_len 
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
8110: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69   0;.    char *ci
8120: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
8130: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
8140: 63 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20  ciphersuites.   
8150: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
8160: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20   char *CAfile.  
8170: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8180: 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20    char *CAdir.. 
8190: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
81a0: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d     char *DHparam
81b0: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
81c0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65  ;.    char *mode
81d0: 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  l..        = NUL
81e0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72  L;.    char *ser
81f0: 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20  vername.        
8200: 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e  = NULL;./* hostn
8210: 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e  ame for Server N
8220: 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a  ame Indication *
8230: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
8240: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
8250: 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  on_id = NULL;.  
8260: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09    Tcl_Obj *alpn.
8270: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74  .= NULL;.    int
8280: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20   ssl2 = 0, ssl3 
8290: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73  = 0;.    int tls
82a0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20  1 = 1, tls1_1 = 
82b0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74  1, tls1_2 = 1, t
82c0: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69  ls1_3 = 1;.    i
82d0: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65  nt proto = 0, le
82e0: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  vel = -1;.    in
82f0: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65  t verify = 0, re
8300: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65  quire = 0, reque
8310: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e  st = 1, post_han
8320: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20  dshake = 0;..   
8330: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8340: 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ");..#if OPENSSL
8350: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
8360: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
8370: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8380: 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  L_NO_SSL2) && !d
8390: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
83a0: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  && defined(NO_SS
83b0: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  L3) && defined(N
83c0: 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e  O_TLS1) && defin
83d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
83e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
83f0: 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  _2) && defined(N
8400: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73  O_TLS1_3).    ss
8410: 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23  l2 = 1;.#endif.#
8420: 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  if !defined(OPEN
8430: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
8440: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
8450: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
8460: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64  SSL2) && defined
8470: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66  (NO_TLS1) && def
8480: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
8490: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
84a0: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64  S1_2) && defined
84b0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  (NO_TLS1_3).    
84c0: 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl3 = 1;.#endif
84d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
84e0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
84f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8500: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a  ).    tls1 = 0;.
8510: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
8520: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
8530: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
8540: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
8550: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64  tls1_1 = 0;.#end
8560: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
8570: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
8580: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8590: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31  TLS1_2).    tls1
85a0: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _2 = 0;.#endif.#
85b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
85c0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
85d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
85e0: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d  _3).    tls1_3 =
85f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
8600: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
8610: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8620: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8630: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74  v, "channel ?opt
8640: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  ions?");..return
8650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8660: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
8670: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
8680: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
8690: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
86a0: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b  ], NULL), NULL);
86b0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
86c0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
86d0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
86e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
86f0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
8700: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
8710: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
8720: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
8730: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
8740: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
8750: 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64  for (idx = 2; id
8760: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29  x < objc; idx++)
8770: 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20   {..char *opt = 
8780: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8790: 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  mObj(objv[idx], 
87a0: 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74  NULL);...if (opt
87b0: 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20  [0] != '-')..   
87c0: 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a   break;...OPTOBJ
87d0: 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b  ("-alpn", alpn);
87e0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72  ..OPTSTR("-cadir
87f0: 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53  ", CAdir);..OPTS
8800: 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41  TR("-cafile", CA
8810: 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28  file);..OPTBYTE(
8820: 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63  "-cert", cert, c
8830: 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54  ert_len);..OPTST
8840: 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63  R("-certfile", c
8850: 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  ertfile);..OPTST
8860: 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70  R("-cipher", cip
8870: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
8880: 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65  -ciphers", ciphe
8890: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
88a0: 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69  iphersuites", ci
88b0: 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50  phersuites);..OP
88c0: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c  TOBJ("-command",
88d0: 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54   script);..OPTST
88e0: 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44  R("-dhparams", D
88f0: 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59  Hparams);..OPTBY
8900: 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20  TE("-key", key, 
8910: 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54  key_len);..OPTST
8920: 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65  R("-keyfile", ke
8930: 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  yfile);..OPTSTR(
8940: 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29  "-model", model)
8950: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73  ;..OPTOBJ("-pass
8960: 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29  word", password)
8970: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73  ;..OPTBOOL("-pos
8980: 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f  t_handshake", po
8990: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09  st_handshake);..
89a0: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73  OPTBOOL("-reques
89b0: 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f  t", request);..O
89c0: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65  PTBOOL("-require
89d0: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50  ", require);..OP
89e0: 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c  TINT("-securityl
89f0: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09  evel", level);..
8a00: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72  OPTBOOL("-server
8a10: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54  ", server);..OPT
8a20: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65  STR("-servername
8a30: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a  ", servername);.
8a40: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f  .OPTSTR("-sessio
8a50: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69  n_id", session_i
8a60: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  d);..OPTBOOL("-s
8a70: 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50  sl2", ssl2);..OP
8a80: 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73  TBOOL("-ssl3", s
8a90: 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl3);..OPTBOOL("
8aa0: 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09  -tls1", tls1);..
8ab0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31  OPTBOOL("-tls1.1
8ac0: 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54  ", tls1_1);..OPT
8ad0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20  BOOL("-tls1.2", 
8ae0: 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f  tls1_2);..OPTBOO
8af0: 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73  L("-tls1.3", tls
8b00: 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  1_3);..OPTOBJ("-
8b10: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
8b20: 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a  , vcmd);..OPTOBJ
8b30: 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b  ("-vcmd", vcmd);
8b40: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f  ...OPTBAD("optio
8b50: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64  n", "-alpn, -cad
8b60: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65  ir, -cafile, -ce
8b70: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d  rt, -certfile, -
8b80: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73  cipher, -ciphers
8b90: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c  uites, -command,
8ba0: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79   -dhparams, -key
8bb0: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64  , -keyfile, -mod
8bc0: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d  el, -password, -
8bd0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20  post_handshake, 
8be0: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69  -request, -requi
8bf0: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76  re, -securitylev
8c00: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65  el, -server, -se
8c10: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69  rvername, -sessi
8c20: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73  on_id, -ssl2, -s
8c30: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73  sl3, -tls1, -tls
8c40: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74  1.1, -tls1.2, -t
8c50: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64  ls1.3, or -valid
8c60: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09  atecommand");...
8c70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8c80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
8c90: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79  request)..verify
8ca0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
8cb0: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
8cc0: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
8cd0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
8ce0: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79   require).verify
8cf0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
8d00: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
8d10: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71  ERT;.    if (req
8d20: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
8d30: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c  dshake).verify |
8d40: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  = SSL_VERIFY_POS
8d50: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20  T_HANDSHAKE;.   
8d60: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30   if (verify == 0
8d70: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f  )..verify = SSL_
8d80: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20  VERIFY_NONE;..  
8d90: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32    proto |= (ssl2
8da0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
8db0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8dc0: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53  o |= (ssl3 ? TLS
8dd0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29  _PROTO_SSL3 : 0)
8de0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8df0: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  tls1 ? TLS_PROTO
8e00: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20  _TLS1 : 0);.    
8e10: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31  proto |= (tls1_1
8e20: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8e30: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_1 : 0);.    pr
8e40: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f  oto |= (tls1_2 ?
8e50: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8e60: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8e70: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54  o |= (tls1_3 ? T
8e80: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20  LS_PROTO_TLS1_3 
8e90: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  : 0);..    /* re
8ea0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62  set to NULL if b
8eb0: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76  lank string prov
8ec0: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  ided */.    if (
8ed0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09  cert && !*cert).
8ee0: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20  .        cert.  
8ef0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8f00: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b    if (key && !*k
8f10: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79  ey)..        key
8f20: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8f30: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
8f40: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29  e && !*certfile)
8f50: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c           certfil
8f60: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  e.= NULL;.    if
8f70: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b   (keyfile && !*k
8f80: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65  eyfile)..keyfile
8f90: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8fa0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
8fb0: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20   && !*ciphers). 
8fc0: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20         ciphers. 
8fd0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8fe0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69     if (ciphersui
8ff0: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73  tes && !*ciphers
9000: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69  uites) ciphersui
9010: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20  tes    = NULL;. 
9020: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26     if (CAfile &&
9030: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20   !*CAfile).     
9040: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20     CAfile.      
9050: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9060: 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 64   (CAdir && !*CAd
9070: 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 69  ir).        CAdi
9080: 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  r.        = NULL
9090: 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  ;.    if (DHpara
90a0: 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73  ms && !*DHparams
90b0: 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61  ).        DHpara
90c0: 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  ms        = NULL
90d0: 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53  ;..    /* new SS
90e0: 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73  L state */.    s
90f0: 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74  tatePtr..= (Stat
9100: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e  e *) ckalloc((un
9110: 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53  signed) sizeof(S
9120: 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73  tate));.    mems
9130: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
9140: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
9150: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
9160: 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20  lags.= flags;.  
9170: 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65    statePtr->inte
9180: 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp.= interp;.   
9190: 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67   statePtr->vflag
91a0: 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20  s.= verify;.    
91b0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20  statePtr->err.= 
91c0: 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f  "";..    /* allo
91d0: 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20  cate script */. 
91e0: 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b     if (script) {
91f0: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
9200: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63  StringFromObj(sc
9210: 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  ript, &len);..if
9220: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
9230: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
9240: 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20   = script;..    
9250: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
9260: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
9270: 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  ack);..}.    }..
9280: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
9290: 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20  password */.    
92a0: 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a  if (password) {.
92b0: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
92c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73  tringFromObj(pas
92d0: 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69  sword, &len);..i
92e0: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
92f0: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
9300: 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20  d = password;.. 
9310: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9320: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
9330: 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20  ssword);..}.    
9340: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  }..    /* alloca
9350: 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d  te validate comm
9360: 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76  and */.    if (v
9370: 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  cmd) {..(void) T
9380: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9390: 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b  Obj(vcmd, &len);
93a0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
93b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64    statePtr->vcmd
93c0: 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63   = vcmd;..    Tc
93d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
93e0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
93f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
9400: 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29   (model != NULL)
9410: 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f   {..int mode;../
9420: 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c  * Get the "model
9430: 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68  " context */..ch
9440: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
9450: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65  nel(interp, mode
9460: 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28  l, &mode);..if (
9470: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
9480: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20  nnel) NULL) {.. 
9490: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
94a0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
94b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
94c0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  ERROR;..}.../*..
94d0: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20   * Make sure to 
94e0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
94f0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09  opmost channel..
9500: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
9510: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
9520: 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65  an);..if (Tcl_Ge
9530: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
9540: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
9550: 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20  lType()) {..    
9560: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9570: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
9580: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
9590: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
95a0: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
95b0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
95c0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
95d0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
95e0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
95f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9600: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74  .}..ctx = ((Stat
9610: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
9620: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
9630: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20  han))->ctx;.    
9640: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63  } else {..if ((c
9650: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74  tx = CTX_Init(st
9660: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20  atePtr, server, 
9670: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20  proto, keyfile, 
9680: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63  certfile, key, c
9690: 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20  ert, key_len,.. 
96a0: 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64     cert_len, CAd
96b0: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
96c0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
96d0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
96e0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
96f0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
9700: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
9710: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
9720: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
9730: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
9740: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
9750: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
9760: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
9770: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
9780: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
9790: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
97a0: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
97b0: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
97c0: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
97d0: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
97e0: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
97f0: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
9800: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
9810: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
9820: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
9830: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
9840: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
9850: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
9860: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
9870: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
9880: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
9890: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
98a0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
98b0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
98c0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
98d0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
98e0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
98f0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
9900: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
9910: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9920: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
9930: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
9940: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
9950: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
9960: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9970: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
9980: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9990: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
99a0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
99b0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
99c0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
99d0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
99e0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
99f0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9a00: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9a10: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
9a20: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9a30: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
9a40: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9a50: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
9a60: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
9a70: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
9a80: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9a90: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
9aa0: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
9ab0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
9ac0: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
9ad0: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
9ae0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
9af0: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
9b00: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
9b10: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
9b20: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
9b30: 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61  ype(), (ClientDa
9b40: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54  ta) statePtr, (T
9b50: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
9b60: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
9b70: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
9b80: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
9b90: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
9ba0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
9bb0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
9bc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
9bd0: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
9be0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9bf0: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
9c00: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
9c10: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
9c20: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
9c30: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
9c40: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
9c50: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
9c60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9c70: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
9c80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9c90: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9ca0: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
9cb0: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
9cc0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9cd0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
9ce0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9cf0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9d00: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9d10: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
9d20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
9d30: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
9d40: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
9d50: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
9d60: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
9d70: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
9d80: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
9d90: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
9da0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
9db0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9dc0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9dd0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9de0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
9df0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9e00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9e10: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a  cking));..    /*
9e20: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
9e30: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
9e40: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
9e50: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
9e60: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
9e70: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
9e80: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
9e90: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
9ea0: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
9eb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
9ec0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
9ed0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
9ee0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
9ef0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
9f00: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
9f10: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
9f20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9f30: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
9f40: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
9f50: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
9f60: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
9f70: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
9f80: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
9f90: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
9fa0: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
9fb0: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
9fc0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
9fd0: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
9fe0: 67 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  g. */..if (!SSL_
9ff0: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
a000: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
a010: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
a020: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
a030: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
a050: 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61  ting TLS host na
a060: 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  me extension fai
a070: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  led", (char *) N
a080: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a090: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a0a0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a0b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a0c0: 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65  }.../* Configure
a0d0: 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d   server host nam
a0e0: 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20  e checks in the 
a0f0: 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20  SSL client. Set 
a100: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a  DNS hostname to.
a110: 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65  .   name for pee
a120: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  r certificate ch
a130: 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68  ecks. SSL_set1_h
a140: 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69  ost has limitati
a150: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
a160: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
a170: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
a180: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
a190: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a1a0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
a1b0: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
a1c0: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
a1d0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
a1e0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a1f0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a210: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a220: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e  * Resume session
a230: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73   id */.    if (s
a240: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72  ession_id && str
a250: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20  len(session_id) 
a260: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43  <= SSL_MAX_SID_C
a270: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a  TX_LENGTH) {../*
a280: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e   SSL_set_session
a290: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  () */..if (!SSL_
a2a0: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f  SESSION_set1_id_
a2b0: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f  context(SSL_get_
a2c0: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72  session(statePtr
a2d0: 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f  ->ssl), session_
a2e0: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  id, (unsigned in
a2f0: 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f  t) strlen(sessio
a300: 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54  n_id))) {..    T
a310: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a320: 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20  interp, "Resume 
a330: 73 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65  session id ", se
a340: 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c  ssion_id, " fail
a350: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
a360: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
a370: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
a380: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  *) statePtr);.  
a390: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a3a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
a3b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c     }..    if (al
a3c0: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72  pn) {../* Conver
a3d0: 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74  t a TCL list int
a3e0: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  o a protocol-lis
a3f0: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74  t in wire-format
a400: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   */..unsigned ch
a410: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a  ar *protos, *p;.
a420: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72  .unsigned int pr
a430: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69  otos_len = 0;..i
a440: 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a  nt i, len, cnt;.
a450: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b  .Tcl_Obj **list;
a460: 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
a470: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
a480: 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74  terp, alpn, &cnt
a490: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f  , &list) != TCL_
a4a0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  OK) {..    Tls_F
a4b0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a4c0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a4d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a4e0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
a4f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
a500: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
a510: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
a520: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
a530: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
a540: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a550: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
a560: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
a570: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
a580: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a590: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
a5a0: 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f  ocol name too lo
a5b0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ng", (char *) NU
a5c0: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
a5d0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a5e0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  r);...return TCL
a5f0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
a600: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b      protos_len +
a610: 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09  = 1 + len;..}...
a620: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d  /* Build the com
a630: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  plete protocol-l
a640: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d  ist */..protos =
a650: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f   ckalloc(protos_
a660: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63  len);../* protoc
a670: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74  ol-lists consist
a680: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68   of 8-bit length
a690: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20  -prefixed, byte 
a6a0: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20  strings */..for 
a6b0: 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74  (i = 0, p = prot
a6c0: 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b  os; i < cnt; i++
a6d0: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73  ) {..    char *s
a6e0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  tr = Tcl_GetStri
a6f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69  ngFromObj(list[i
a700: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a  ], &len);..    *
a710: 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20  p++ = len;..    
a720: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c  memcpy(p, str, l
a730: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c  en);..    p += l
a740: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f  en;..}.../* SSL_
a750: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20  set_alpn_protos 
a760: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
a770: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
a780: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54  t */../* Note: T
a790: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
a7a0: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72  verses the retur
a7b0: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69  n value conventi
a7c0: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73  on */..if (SSL_s
a7d0: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73  et_alpn_protos(s
a7e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72  tatePtr->ssl, pr
a7f0: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e  otos, protos_len
a800: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a810: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a820: 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65  p, "failed to se
a830: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73  t ALPN protocols
a840: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a850: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
a860: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a870: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
a880: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
a890: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a8a0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
a8b0: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
a8c0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
a8d0: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
a8e0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
a8f0: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
a900: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
a910: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
a920: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
a930: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
a940: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
a950: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
a960: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
a970: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
a980: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
a990: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
a9a0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
a9b0: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
a9c0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
a9d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
a9e0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
a9f0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73  back);.    SSL_s
aa00: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b  et_info_callback
aa10: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
aa20: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  InfoCallback);..
aa30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63      /* Create Tc
aa40: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61  l_Channel BIO Ha
aa50: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61  ndler */.    sta
aa60: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42  tePtr->p_bio.= B
aa70: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65  IO_new_tcl(state
aa80: 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45  Ptr, BIO_NOCLOSE
aa90: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
aaa0: 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42  >bio.= BIO_new(B
aab0: 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20  IO_f_ssl());..  
aac0: 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a    if (server) {.
aad0: 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62  ./* Server callb
aae0: 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  acks */..SSL_CTX
aaf0: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
ab00: 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65  ername_arg(state
ab10: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
ab20: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53  *)statePtr);..SS
ab30: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
ab40: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c  _servername_call
ab50: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
ab60: 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29  tx, SNICallback)
ab70: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ;..SSL_CTX_set_c
ab80: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73  lient_hello_cb(s
ab90: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65  tatePtr->ctx, He
aba0: 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  lloCallback, (vo
abb0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
abc0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70  .if (statePtr->p
abd0: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
abe0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
abf0: 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62  t_alpn_select_cb
ac00: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
ac10: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
ac20: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
ac30: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
ac40: 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20  .    if (tls1_2 
ac50: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d  == 0 && tls1_3 =
ac60: 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58  = 0) {...SSL_CTX
ac70: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73  _set_next_protos
ac80: 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73  _advertised_cb(s
ac90: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50  tatePtr->ctx, NP
aca0: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
acb0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
acc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a     }.#endif..}..
acd0: 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65  ./* Enable serve
ace0: 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72  r to send cert r
acf0: 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e  equest after han
ad00: 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20  dshake (TLS 1.3 
ad10: 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77  only) */../* A w
ad20: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d  rite operation m
ad30: 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66  ust take place f
ad40: 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61  or the Certifica
ad50: 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65  te Request to be
ad60: 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65  ..   sent to the
ad70: 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61   client, this ca
ad80: 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53  n be done with S
ad90: 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28  SL_do_handshake(
ada0: 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  ). */..if (reque
adb0: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
adc0: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
add0: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
ade0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
adf0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
ae00: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
ae10: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
ae20: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
ae30: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
ae40: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
ae50: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
ae60: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
ae70: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
ae80: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
ae90: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
aea0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
aeb0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
aec0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
aed0: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
aee0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
aef0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
af00: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
af10: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
af20: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
af30: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
af40: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
af50: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
af60: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
af70: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
af80: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
af90: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
afa0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
afb0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
afc0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
afd0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
afe0: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
aff0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
b000: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
b010: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
b020: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
b030: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
b040: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
b050: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
b060: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
b070: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
b080: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
b090: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
b0a0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
b0b0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
b0c0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
b0d0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
b0e0: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
b0f0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
b100: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
b110: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
b120: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
b130: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
b140: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
b150: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
b160: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
b170: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
b180: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
b190: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
b1a0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
b1b0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
b1c0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
b1d0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b1e0: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
b1f0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
b200: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
b210: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
b220: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b230: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
b240: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
b250: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b290: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
b2a0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d  nimportObjCmd --
b2b0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
b2c0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
b2d0: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
b2e0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66  opmost channel f
b2f0: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  ilter.. *. * Res
b300: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
b310: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
b320: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
b330: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
b340: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
b350: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
b360: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
b3b0: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72  atic int.Unimpor
b3c0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
b3d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
b3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b3f0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
b400: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
b410: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
b420: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
b430: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
b440: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
b450: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
b460: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
b470: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
b480: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b490: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b4a0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
b4b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b4c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
b4d0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
b4e0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
b4f0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
b500: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
b510: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
b520: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
b530: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b540: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b550: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
b560: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
b570: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
b580: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
b590: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
b5a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  );..    if (Tcl_
b5b0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
b5c0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
b5d0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
b5e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b5f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
b600: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
b610: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
b620: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
b630: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
b640: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
b650: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
b660: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
b670: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
b680: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45  , chan) == TCL_E
b690: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20  RROR) {..return 
b6a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b6b0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b6c0: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
b6d0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
b6e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
b6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
b730: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
b740: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
b750: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
b760: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
b770: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
b780: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
b790: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
b7a0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
b7b0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
b7c0: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
b7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
b810: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
b820: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  .CTX_Init(State 
b830: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
b840: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
b850: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c  to, char *keyfil
b860: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c  e, char *certfil
b870: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
b880: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67  char *key, unsig
b890: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20  ned char *cert, 
b8a0: 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74  int key_len, int
b8b0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20   cert_len, char 
b8c0: 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72  *CAdir,.    char
b8d0: 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a   *CAfile, char *
b8e0: 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63  ciphers, char *c
b8f0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74  iphersuites, int
b900: 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48   level, char *DH
b910: 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63  params) {.    Tc
b920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b930: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74   = statePtr->int
b940: 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  erp;.    SSL_CTX
b950: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
b960: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
b970: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b980: 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f  g ds1;.    int o
b990: 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ff = 0;.    int 
b9a0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
b9b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
b9c0: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a  METHOD *method;.
b9d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
b9e0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
b9f0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f  (!proto) {..Tcl_
ba00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ba10: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70  erp, "no valid p
ba20: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
ba30: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
ba40: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
ba50: 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c     /* create SSL
ba60: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20   context */.#if 
ba70: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
ba80: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
ba90: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
baa0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
bab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
bac0: 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL2).    if (EN
bad0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
bae0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a  _PROTO_SSL2)) {.
baf0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
bb00: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20  t(interp, "SSL2 
bb10: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
bb20: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
bb30: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
bb40: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
bb50: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
bb60: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
bb70: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20  SL_NO_SSL3).    
bb80: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
bb90: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
bba0: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
bbb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bbc0: 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL3 protocol n
bbd0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
bbe0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
bbf0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
bc00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
bc10: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
bc20: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
bc30: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
bc40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
bc50: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c  TO_TLS1)) {..Tcl
bc60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bc70: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70  terp, "TLS 1.0 p
bc80: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
bc90: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
bca0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
bcb0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
bcc0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
bcd0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
bce0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
bcf0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
bd00: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
bd10: 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_1)) {..Tcl_
bd20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bd30: 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72  erp, "TLS 1.1 pr
bd40: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
bd50: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
bd60: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
bd70: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
bd80: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
bd90: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
bda0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
bdb0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
bdc0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
bdd0: 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_2)) {..Tcl_A
bde0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bdf0: 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f  rp, "TLS 1.2 pro
be00: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
be10: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
be20: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
be30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
be40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
be50: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
be60: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
be70: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
be80: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
be90: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_3)) {..Tcl_Ap
bea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
beb0: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74  p, "TLS 1.3 prot
bec0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
bed0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
bee0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
bef0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74  #endif..    swit
bf00: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
bf10: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
bf20: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
bf30: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
bf40: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
bf50: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
bf60: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
bf70: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
bf80: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
bf90: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
bfa0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
bfb0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
bfc0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
bfd0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
bfe0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
bff0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c000: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
c010: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
c020: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
c030: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
c040: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
c050: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
c060: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
c070: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
c080: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
c090: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
c0a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
c0b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c0c0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
c0d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c0e0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
c0f0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
c100: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
c110: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
c120: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
c130: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
c140: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
c150: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
c160: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
c170: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c180: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
c190: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c1a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
c1b0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
c1c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
c1d0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
c1e0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
c1f0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
c200: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
c210: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
c220: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
c230: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
c240: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c250: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
c260: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c270: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
c280: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
c290: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
c2a0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
c2b0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
c2c0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
c2d0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
c2e0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
c2f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c300: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
c310: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c320: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
c330: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
c340: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
c350: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
c360: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
c370: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
c380: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
c390: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
c3a0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
c3b0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
c3c0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
c3d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
c3e0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
c3f0: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
c400: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
c410: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
c420: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
c430: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
c440: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
c450: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
c460: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
c470: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
c480: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
c490: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
c4a0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
c4b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
c4c0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
c4d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
c4e0: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
c4f0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
c500: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
c510: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
c520: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
c530: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
c540: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
c550: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
c560: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
c570: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
c580: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
c590: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
c5a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c5b0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
c5c0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
c5d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
c5e0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
c5f0: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
c600: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c610: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
c620: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c630: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
c640: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
c650: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
c660: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
c670: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
c680: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
c690: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
c6a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c6b0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
c6c0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
c6d0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
c6e0: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
c6f0: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
c700: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
c710: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
c720: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c730: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
c740: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
c750: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
c760: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
c770: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
c780: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
c790: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
c7a0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
c7b0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
c7c0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
c7d0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
c7e0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20  turn(NULL);.    
c7f0: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e  }..    if (geten
c800: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
c810: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
c820: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b  _keylog_callback
c830: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c  (ctx, KeyLogCall
c840: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  back);.    }..#i
c850: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
c860: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
c870: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
c880: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
c890: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
c8a0: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43  TLS1_3) {..SSL_C
c8b0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
c8c0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
c8d0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
c8e0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
c8f0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
c900: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
c910: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
c920: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63  ..    /* Force c
c930: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20  ipher selection 
c940: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20  order by server 
c950: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  */.    if (!isSe
c960: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
c970: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
c980: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
c990: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
c9a0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53  E);.    }..    S
c9b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
c9c0: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
c9d0: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
c9e0: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
c9f0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
ca00: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
ca10: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
ca20: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
ca30: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
ca40: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
ca50: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66  options(ctx, off
ca60: 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70  );../* disable p
ca70: 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73  rotocol versions
ca80: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
ca90: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
caa0: 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20   0x10101000L.   
cab0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64   SSL_CTX_set_mod
cac0: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f  e(ctx, SSL_MODE_
cad0: 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20  AUTO_RETRY);./* 
cae0: 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73  handle new hands
caf0: 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f  hakes in backgro
cb00: 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75  und. On by defau
cb10: 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e  lt in OpenSSL 1.
cb20: 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  1.1. */.#endif. 
cb30: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f     SSL_CTX_sess_
cb40: 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63  set_cache_size(c
cb50: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f  tx, 128);..    /
cb60: 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e  * Set user defin
cb70: 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  ed ciphers, ciph
cb80: 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73  er suites, and s
cb90: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
cba0: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
cbb0: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
cbc0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
cbd0: 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68  r_list(ctx, ciph
cbe0: 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  ers)) {..Tcl_App
cbf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
cc00: 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66  , "Set ciphers f
cc10: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20  ailed: No valid 
cc20: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20  ciphers", (char 
cc30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
cc40: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
cc50: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
cc60: 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  }.    if ((ciphe
cc70: 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29  rsuites != NULL)
cc80: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
cc90: 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74  _ciphersuites(ct
cca0: 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29  x, ciphersuites)
ccb0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
ccc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
ccd0: 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73  et cipher suites
cce0: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
ccf0: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
cd00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
cd10: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
cd20: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
cd30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
cd40: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
cd50: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20  /.    if (level 
cd60: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20  > -1 && level < 
cd70: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  6) {../* SSL_set
cd80: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20  _security_level 
cd90: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
cda0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63  security_level(c
cdb0: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20  tx, level);.    
cdc0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f  }..    /* set so
cdd0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  me callbacks */.
cde0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
cdf0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
ce00: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43  b(ctx, PasswordC
ce10: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
ce20: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
ce30: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72  t_passwd_cb_user
ce40: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20  data(ctx, (void 
ce50: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  *)statePtr);..  
ce60: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66    /* read a Diff
ce70: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d  ie-Hellman param
ce80: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75  eters file, or u
ce90: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  se the built-in 
cea0: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50  one */.#ifdef OP
ceb0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20  ENSSL_NO_DH.    
cec0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
ced0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
cee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
cef0: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20  , "DH parameter 
cf00: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69  support not avai
cf10: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29  lable", (char *)
cf20: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
cf30: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
cf40: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
cf50: 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a  #else.    {..DH*
cf60: 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61   dh;..if (DHpara
cf70: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ms != NULL) {.. 
cf80: 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20     BIO *bio;..  
cf90: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
cfa0: 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f  t(&ds);..    bio
cfb0: 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28   = BIO_new_file(
cfc0: 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64  F2N(DHparams, &d
cfd0: 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69  s), "r");..    i
cfe0: 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c  f (!bio) {...Tcl
cff0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
d000: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
d010: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
d020: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48  ould not find DH
d030: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
d040: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d050: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
d060: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
d070: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09   NULL;..    }...
d080: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61      dh = PEM_rea
d090: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62  d_bio_DHparams(b
d0a0: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  io, NULL, NULL, 
d0b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
d0c0: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20  free(bio);..    
d0d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d0e0: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21  &ds);..    if (!
d0f0: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  dh) {...Tcl_Appe
d100: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d110: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64   "Could not read
d120: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66   DH parameters f
d130: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72  rom file", (char
d140: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
d150: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
d160: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
d170: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a      }..} else {.
d180: 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68  .    dh = get_dh
d190: 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53  Params();..}..SS
d1a0: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68  L_CTX_set_tmp_dh
d1b0: 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66  (ctx, dh);..DH_f
d1c0: 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23  ree(dh);.    }.#
d1d0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65  endif..    /* se
d1e0: 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74  t our certificat
d1f0: 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72  e */.    load_pr
d200: 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20  ivate_key = 0;. 
d210: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
d220: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
d230: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
d240: 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;...Tcl_DStringI
d250: 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28  nit(&ds);...if (
d260: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
d270: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78  ificate_file(ctx
d280: 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20  , F2N(certfile, 
d290: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59  &ds), SSL_FILETY
d2a0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
d2b0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d2c0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
d2d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d2e0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
d2f0: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63   to set certific
d300: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
d310: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20  file, ": ",.... 
d320: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
d330: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
d340: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
d350: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
d360: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
d370: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
d380: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
d390: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
d3a0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
d3b0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
d3c0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
d3d0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
d3e0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d3f0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
d400: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d410: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
d420: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63   to set certific
d430: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  ate: ",....     
d440: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
d450: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
d460: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
d470: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
d480: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
d490: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20  e {..certfile = 
d4a0: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f  (char*)X509_get_
d4b0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c  default_cert_fil
d4c0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  e();...if (SSL_C
d4d0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
d4e0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72  te_file(ctx, cer
d4f0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54  tfile, SSL_FILET
d500: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
d510: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f  .#if 0..    Tcl_
d520: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
d530: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
d540: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d550: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
d560: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
d570: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
d580: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20  ile, ": ",....  
d590: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
d5a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
d5b0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
d5c0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
d5d0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d   NULL;.#endif..}
d5e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
d5f0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b  et our private k
d600: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f  ey */.    if (lo
d610: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20  ad_private_key) 
d620: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d  {..if (keyfile =
d630: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d  = NULL && key ==
d640: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65   NULL) {..    ke
d650: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
d660: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69  ;..}...if (keyfi
d670: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
d680: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72     /* get the pr
d690: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
d6a0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
d6b0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
d6c0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d     if (keyfile =
d6d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66  = NULL) {...keyf
d6e0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
d6f0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
d700: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
d710: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
d720: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
d730: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
d740: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
d750: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
d760: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
d770: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
d780: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
d790: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
d7a0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
d7b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
d7c0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
d7d0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
d7e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
d7f0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
d800: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
d810: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20  yfile, " ",.... 
d820: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29          REASON()
d830: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d840: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
d850: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
d860: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
d870: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
d880: 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65  e(&ds);...} else
d890: 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c   if (key != NULL
d8a0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c  ) {..    if (SSL
d8b0: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
d8c0: 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45  Key_ASN1(EVP_PKE
d8d0: 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c  Y_RSA, ctx, key,
d8e0: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b  key_len) <= 0) {
d8f0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
d900: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
d910: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
d920: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
d930: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
d940: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
d950: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
d960: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
d970: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
d980: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
d990: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
d9a0: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53  lic key: ", REAS
d9b0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
d9c0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
d9d0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
d9e0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
d9f0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
da00: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
da10: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
da20: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
da30: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
da40: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
da50: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
da60: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
da70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
da80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
da90: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
daa0: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
dab0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
dac0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
dad0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
dae0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
daf0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
db00: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  NULL;..}.    }..
db10: 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66      /* Set verif
db20: 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20  ication CAs */. 
db30: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
db40: 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c  it(&ds);.    Tcl
db50: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
db60: 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c  1);.    if (!SSL
db70: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
db80: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20  _locations(ctx, 
db90: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
dba0: 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73  , F2N(CAdir, &ds
dbb0: 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58  1)) ||..!SSL_CTX
dbc0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
dbd0: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
dbe0: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74  {.#if 0..Tcl_DSt
dbf0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
dc00: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
dc10: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74  &ds1);../* Don't
dc20: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20   currently care 
dc30: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f  if this fails */
dc40: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
dc50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20  lt(interp, "SSL 
dc60: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70  default verify p
dc70: 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28  aths: ", REASON(
dc80: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
dc90: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
dca0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
dcb0: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ULL;.#endif.    
dcc0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  }..    /* https:
dcd0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
dce0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
dcf0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54   */.    /* XXX:T
dd00: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65  ODO: Let the use
dd10: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20  r supply values 
dd20: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20  here instead of 
dd30: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65  something that e
dd40: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c  xists on the fil
dd50: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69  esystem */.    i
dd60: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
dd70: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58  L) {..STACK_OF(X
dd80: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
dd90: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
dda0: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
ddb0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
ddc0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73  ;..if (certNames
ddd0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
dde0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
ddf0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
de00: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a   certNames);..}.
de10: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
de20: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
de30: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
de40: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20  Free(&ds1);.    
de50: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
de60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
de70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dea0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
deb0: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
dec0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
ded0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
dee0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
def0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
df00: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
df10: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
df20: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
df30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
df40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df70: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
df80: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
df90: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
dfa0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
dfb0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
dfc0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
dfd0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
dfe0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
dff0: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
e000: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
e010: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
e020: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
e030: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
e040: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
e050: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
e060: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
e070: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
e080: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
e090: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b  en;.    int nid;
e0a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
e0b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77  alled");..    sw
e0c0: 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63  itch (objc) {..c
e0d0: 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e  ase 2:..    chan
e0e0: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
e0f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
e100: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09  bjv[1], NULL);..
e110: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
e120: 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73  e 3:..    if (!s
e130: 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74  trcmp (Tcl_GetSt
e140: 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20  ring (objv[1]), 
e150: 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63  "-local")) {...c
e160: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c  hannelName = Tcl
e170: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e180: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29  j(objv[2], NULL)
e190: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
e1a0: 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66  }..    /* else f
e1b0: 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20  all-through ... 
e1c0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
e1d0: 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f  _GNUC__)..    __
e1e0: 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c  attribute__((fal
e1f0: 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64  lthrough));.#end
e200: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
e210: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e220: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
e230: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68  jv, "?-local? ch
e240: 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65  annel");..    re
e250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e260: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
e270: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
e280: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c  (interp, channel
e290: 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20  Name, &mode);.  
e2a0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
e2b0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
e2c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
e2d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e2e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
e2f0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
e300: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
e310: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
e320: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
e330: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
e340: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
e350: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
e360: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
e370: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e380: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
e390: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
e3a0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
e3b0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
e3c0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
e3d0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
e3e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e3f0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
e400: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65  (State *) Tcl_Ge
e410: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
e420: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
e430: 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63   /* Get certific
e440: 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20  ate for peer or 
e450: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28  self */.    if (
e460: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65  objc == 2) {..pe
e470: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  er = SSL_get_pee
e480: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  r_certificate(st
e490: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
e4a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72    } else {..peer
e4b0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69   = SSL_get_certi
e4c0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
e4d0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
e4e0: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62   if (peer) {..ob
e4f0: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35  jPtr = Tls_NewX5
e500: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65  09Obj(interp, pe
e510: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d  er);..if (objc =
e520: 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65  = 2) { X509_free
e530: 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20  (peer); }.    } 
e540: 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d  else {..objPtr =
e550: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
e560: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  0, NULL);.    }.
e570: 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72  .    /* Peer cer
e580: 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20  t chain (client 
e590: 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41  only) */.    STA
e5a0: 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c  CK_OF(X509)* ssl
e5b0: 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74  _certs = SSL_get
e5c0: 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e  _peer_cert_chain
e5d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
e5e0: 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 20 26  .    if (!peer &
e5f0: 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20  & (ssl_certs == 
e600: 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f  NULL || sk_X509_
e610: 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 20 3d  num(ssl_certs) =
e620: 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e 20  = 0)) {..return 
e630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e640: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
e650: 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a  me from cert */.
e660: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
e670: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
e680: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e690: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
e6a0: 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a  eername", -1));.
e6b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
e6c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
e6d0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e6e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
e6f0: 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28  L_get0_peername(
e700: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
e710: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  -1));..    Tcl_L
e720: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e730: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
e740: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
e750: 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31  gObj("sbits", -1
e760: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
e770: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e780: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e790: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
e7a0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
e7b0: 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
e7c0: 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20  , NULL)));..    
e7d0: 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a  ciphers = (char*
e7e0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28  )SSL_get_cipher(
e7f0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
e800: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
e810: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74   != NULL) && (st
e820: 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28  rcmp(ciphers, "(
e830: 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b  NONE)") != 0)) {
e840: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
e850: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
e860: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
e870: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
e880: 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
e890: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e8a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e8b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e8c0: 69 6e 67 4f 62 6a 28 63 69 70 68 65 72 73 2c 20  ingObj(ciphers, 
e8d0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  -1));.    }..   
e8e0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58   /* Verify the X
e8f0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
e900: 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65  presented by the
e910: 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c   peer */.    Tcl
e920: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e930: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e940: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e950: 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 69 63 61  ingObj("verifica
e960: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  tion", -1));.   
e970: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
e980: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
e990: 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e  , objPtr,..Tcl_N
e9a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 58 35 30 39  ewStringObj(X509
e9b0: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
e9c0: 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
e9d0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
e9e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c  statePtr->ssl)),
e9f0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52   -1));..    /* R
ea00: 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
ea10: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
ea20: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e   result of the n
ea30: 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20  egotiation */.  
ea40: 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f    SSL_get0_alpn_
ea50: 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74  selected(statePt
ea60: 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  r->ssl, &proto, 
ea70: 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  &len);.    Tcl_L
ea80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ea90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
eaa0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
eab0: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
eac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
ead0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
eae0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
eaf0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
eb00: 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20  ((char *)proto, 
eb10: 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20  (int) len));.   
eb20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
eb30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
eb40: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
eb50: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74  wStringObj("prot
eb60: 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20  ocol", -1));.   
eb70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
eb80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
eb90: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
eba0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67  wStringObj(SSL_g
ebb0: 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65  et_version(state
ebc0: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b  Ptr->ssl), -1));
ebd0: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66  ..    /* Valid f
ebe0: 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61  or non-RSA signa
ebf0: 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33  ture and TLS 1.3
ec00: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   */.    Tcl_List
ec10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
ec20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
ec30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ec40: 6a 28 22 73 69 67 6e 61 74 75 72 65 48 61 73 68  j("signatureHash
ec50: 41 6c 67 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29  Algorithm", -1))
ec60: 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ;.    if (objc =
ec70: 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65  = 2 ? SSL_get_pe
ec80: 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  er_signature_nid
ec90: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
eca0: 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f  &nid) : SSL_get_
ecb0: 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
ecc0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
ecd0: 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f  d)) {..Tcl_ListO
ece0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ecf0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ed00: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ed10: 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29  (OBJ_nid2ln(nid)
ed20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c  , -1));.    } el
ed30: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  se {..Tcl_ListOb
ed40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ed50: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
ed60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
ed70: 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  "", -1));.    }.
ed80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
ed90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
eda0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
edb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
edc0: 69 67 6e 61 74 75 72 65 5f 74 79 70 65 22 2c 20  ignature_type", 
edd0: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62  -1));.    if (ob
ede0: 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65  jc == 2 ? SSL_ge
edf0: 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
ee00: 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
ee10: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a  tr->ssl, &nid) :
ee20: 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75   SSL_get_signatu
ee30: 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
ee40: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
ee50: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
ee60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ee70: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
ee80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f  l_NewStringObj(O
ee90: 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
eea0: 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  -1));.    } else
eeb0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
eec0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
eed0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
eee0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
eef0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  , -1));.    }.. 
ef00: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
ef10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
ef20: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
ef30: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
ef40: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
ef50: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
efa0: 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  *. * ConnectionI
efb0: 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  nfoObjCmd -- ret
efc0: 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  urn connection i
efd0: 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  nfo from OpenSSL
efe0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
eff0: 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f  . *.A list of co
f000: 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20  nnection info.  
f010: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f050: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
f060: 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69  tic int Connecti
f070: 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69  onInfoObjCmd(Cli
f080: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
f090: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
f0a0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
f0b0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
f0c0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
f0d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
f0e0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
f0f0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
f100: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
f110: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
f120: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
f130: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
f140: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
f150: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
f160: 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
f170: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
f180: 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
f190: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
f1a0: 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ion;.    const u
f1b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
f1c0: 6f 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f  oto;.    long mo
f1d0: 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  de;..    if (obj
f1e0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
f1f0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f200: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
f210: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
f220: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
f230: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
f240: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
f250: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
f260: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f270: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
f280: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
f290: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
f2a0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28  NULL) {..return(
f2b0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
f2c0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
f2d0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
f2e0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
f2f0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
f300: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
f310: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
f320: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
f330: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
f340: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
f350: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
f360: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f370: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
f380: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
f390: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a  Name(chan), "\":
f3a0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
f3b0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  el", NULL);..ret
f3c0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
f3d0: 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74      }..    objPt
f3e0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
f3f0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
f400: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
f410: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74  info */.    stat
f420: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
f430: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
f440: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
f450: 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74  ;.    ssl = stat
f460: 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69  ePtr->ssl;.    i
f470: 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
f480: 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  {../* connection
f490: 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c   state */..Tcl_L
f4a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f4b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f4c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f4d0: 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31  gObj("state", -1
f4e0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f4f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f500: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f510: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
f520: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
f530: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b  long(ssl), -1));
f540: 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65  .../* Get SNI re
f550: 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e  quested server n
f560: 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  ame */..Tcl_List
f570: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f580: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f590: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f5a0: 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20  j("servername", 
f5b0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
f5c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f5d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f5e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f5f0: 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e  (SSL_get_servern
f600: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
f610: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
f620: 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  me), -1));.../* 
f630: 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  Get protocol */.
f640: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f650: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f660: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f670: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74  wStringObj("prot
f680: 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63  ocol", -1));..Tc
f690: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f6a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f6b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f6c0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
f6d0: 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31  version(ssl), -1
f6e0: 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74  ));.../* Renegot
f6f0: 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a  iation allowed *
f700: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
f710: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f720: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f730: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65  NewStringObj("re
f740: 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31  negotiation", -1
f750: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f760: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f770: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f780: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
f790: 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63  .    SSL_get_sec
f7a0: 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f  ure_renegotiatio
f7b0: 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f  n_support(ssl) ?
f7c0: 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22   "supported" : "
f7d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
f7e0: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73  -1));.../* Get s
f7f0: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
f800: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f810: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f820: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f830: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63  ewStringObj("sec
f840: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29  uritylevel", -1)
f850: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
f860: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f870: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
f880: 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67  _NewIntObj(SSL_g
f890: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
f8a0: 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53  l(ssl)));.../* S
f8b0: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09  ession info */..
f8c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f8d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f8e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f8f0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
f900: 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29  on_reused", -1))
f910: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
f920: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f930: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f940: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53  NewBooleanObj(SS
f950: 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  L_session_reused
f960: 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73  (ssl)));.../* Is
f970: 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   server info */.
f980: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f990: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f9a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f9b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73  wStringObj("is_s
f9c0: 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  erver", -1));..T
f9d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f9e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f9f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
fa00: 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73  ooleanObj(SSL_is
fa10: 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b 0a  _server(ssl)));.
fa20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69      }..    /* Ci
fa30: 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  pher info */.   
fa40: 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65   cipher = SSL_ge
fa50: 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72  t_current_cipher
fa60: 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63  (ssl);.    if (c
fa70: 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  ipher != NULL) {
fa80: 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49  ..char buf[BUFSI
fa90: 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62  Z] = {0};..int b
faa0: 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a  its, alg_bits;..
fab0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
fac0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fad0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fae0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68  wStringObj("ciph
faf0: 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  er", -1));..Tcl_
fb00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fb10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fb20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
fb30: 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52  ngObj(SSL_CIPHER
fb40: 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
fb50: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
fb60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fb70: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fb80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
fb90: 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61  Obj("standard_na
fba0: 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  me", -1));..Tcl_
fbb0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fbc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fbd0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
fbe0: 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52  ngObj(SSL_CIPHER
fbf0: 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
fc00: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09  ipher), -1));...
fc10: 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45  bits = SSL_CIPHE
fc20: 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65  R_get_bits(ciphe
fc30: 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09  r, &alg_bits);..
fc40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fc50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fc60: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
fc70: 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22  StringObj("bits"
fc80: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fc90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fca0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fcb0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
fcc0: 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  bits));..Tcl_Lis
fcd0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fce0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fcf0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fd00: 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22  bj("secret_bits"
fd10: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fd20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fd30: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fd40: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
fd50: 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20  alg_bits));../* 
fd60: 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75  alg_bits is actu
fd70: 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69  al key secret bi
fd80: 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20  ts. If use bits 
fd90: 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f  and secret (algo
fda0: 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66  rithm) bits diff
fdb0: 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74  er,..   the rest
fdc0: 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65   of the bits are
fdd0: 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72   fixed, i.e. for
fde0: 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20   limited export 
fdf0: 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20  ciphers (bits < 
fe00: 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  56) */..Tcl_List
fe10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fe20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fe30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fe40: 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c  j("min_version",
fe50: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
fe60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fe70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fe80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fe90: 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  j(SSL_CIPHER_get
fea0: 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29  _version(cipher)
feb0: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  , -1));.../* Get
fec0: 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
fed0: 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
fee0: 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  D */..Tcl_ListOb
fef0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ff00: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
ff10: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
ff20: 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  "id", -1));..Tcl
ff30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ff40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ff50: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
ff60: 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49  Obj((int) SSL_CI
ff70: 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
ff80: 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c  er)));...if (SSL
ff90: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
ffa0: 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
ffb0: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
ffc0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
ffd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ffe0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fff0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10000 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70  ringObj("descrip
10010 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20  tion", -1));..  
10020 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10030 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10040 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10050 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c  ewStringObj(buf,
10060 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a   -1));..}.    }.
10070 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
10080 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73  info */.    sess
10090 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ion = SSL_get_se
100a0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20  ssion(ssl);.    
100b0 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e  if (session != N
100c0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
100d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
100e0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  ket;..size_t len
100f0 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  2;..unsigned int
10100 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e   ulen;..const un
10110 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
10120 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62  sion_id;..char b
10130 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
10140 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
10150 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
10160 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
10170 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
10180 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
10190 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
101a0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
101b0 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
101c0 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
101d0 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  2);..Tcl_ListObj
101e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
101f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10200 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10210 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  alpn", -1));..Tc
10220 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10230 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10240 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10250 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
10260 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e  proto, (int) len
10270 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  2));.../* Report
10280 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
10290 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
102a0 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65  lt of the NPN ne
102b0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66  gotiation */.#if
102c0 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c  def USE_NPN..SSL
102d0 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f  _get0_next_proto
102e0 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c  _negotiated(ssl,
102f0 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b   &proto, &ulen);
10300 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10310 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10320 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10330 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e  ewStringObj("npn
10340 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
10350 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10360 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10370 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10380 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74  Obj((char *)prot
10390 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b  o, (int) ulen));
103a0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
103b0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
103c0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
103d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
103e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
103f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65  NewStringObj("re
10400 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a  sumable", -1));.
10410 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10420 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10430 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10440 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53  wIntObj(SSL_SESS
10450 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
10460 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
10470 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
10480 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
10490 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54  nce epoch) */..T
104a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
104b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
104c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
104d0 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f  tringObj("start_
104e0 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  time", -1));..Tc
104f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10500 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10510 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f  bjPtr, Tcl_NewLo
10520 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f  ngObj(SSL_SESSIO
10530 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69  N_get_time(sessi
10540 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  on)));.../* Time
10550 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
10560 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
10570 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
10580 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10590 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
105a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
105b0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65  wStringObj("time
105c0 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  out", -1));..Tcl
105d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
105e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
105f0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  jPtr, Tcl_NewLon
10600 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  gObj(SSL_SESSION
10610 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73  _get_timeout(ses
10620 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65  sion)));.../* Se
10630 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66  ssion ticket lif
10640 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73  etime hint (in s
10650 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f  econds) */..Tcl_
10660 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10670 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10680 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10690 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22  ngObj("lifetime"
106a0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
106b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
106c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
106d0 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
106e0 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  (SSL_SESSION_get
106f0 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
10700 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29  _hint(session)))
10710 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69  ;.../* Session i
10720 64 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  d */..session_id
10730 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
10740 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
10750 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  ulen);..Tcl_List
10760 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10770 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10780 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10790 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  j("session_id", 
107a0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
107b0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
107c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
107d0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
107e0 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
107f0 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09  (int) ulen));...
10800 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
10810 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
10820 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
10830 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
10840 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
10850 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  en2);..Tcl_ListO
10860 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10870 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10880 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10890 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74  ("session_ticket
108a0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
108b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
108c0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
108d0 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
108e0 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
108f0 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f  int) len2));.../
10900 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
10910 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f  a */..SSL_SESSIO
10920 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
10930 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26  pdata(session, &
10940 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
10950 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10960 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10970 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10980 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b  wStringObj("tick
10990 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31  et_app_data", -1
109a0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
109b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
109c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
109d0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
109e0 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20  j(ticket, (int) 
109f0 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  len2));.../* Get
10a00 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09   master key */..
10a10 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49  len2 = SSL_SESSI
10a20 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65  ON_get_master_ke
10a30 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65  y(session, buffe
10a40 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  r, SSL_MAX_MASTE
10a50 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09  R_KEY_LENGTH);..
10a60 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10a70 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10a80 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10a90 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65  StringObj("maste
10aa0 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54  r_key", -1));..T
10ab0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10ac0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10ad0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
10ae0 79 74 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66  yteArrayObj(buff
10af0 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29  er, (int) len2))
10b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10b10 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
10b20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
10b30 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
10b40 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
10b50 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
10b60 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
10b70 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
10b80 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
10b90 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
10ba0 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
10bb0 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
10bc0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f  ion(ssl);...Tcl_
10bd0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10be0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10bf0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10c00 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69  ngObj("compressi
10c10 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
10c20 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10c30 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10c40 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10c50 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c  ngObj(comp ? SSL
10c60 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63  _COMP_get_name(c
10c70 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d  omp) : "NONE", -
10c80 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
10c90 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10ca0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10cb0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10cc0 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29  "expansion", -1)
10cd0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10ce0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10cf0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10d00 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78  _NewStringObj(ex
10d10 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  pn ? SSL_COMP_ge
10d20 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22  t_name(expn) : "
10d30 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c  NONE", -1));.#el
10d40 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  se..Tcl_ListObjA
10d50 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10d60 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10d70 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
10d80 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29  ompression", -1)
10d90 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10da0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10db0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10dc0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e  _NewStringObj("N
10dd0 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ONE", -1));..Tcl
10de0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10df0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10e00 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10e10 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f  ingObj("expansio
10e20 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
10e30 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10e40 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10e50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10e60 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29  gObj("NONE", -1)
10e70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
10e80 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
10e90 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20  nfo */.    mode 
10ea0 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65  = SSL_CTX_get_se
10eb0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
10ec0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
10ed0 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20  .    if (mode & 
10ee0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f  SSL_SESS_CACHE_O
10ef0 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22  FF) {..proto = "
10f00 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  off";.    } else
10f10 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
10f20 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
10f30 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63  T) {..proto = "c
10f40 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c  lient";.    } el
10f50 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
10f60 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
10f70 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20  VER) {..proto = 
10f80 22 73 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20  "server";.    } 
10f90 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
10fa0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42  SSL_SESS_CACHE_B
10fb0 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20  OTH) {..proto = 
10fc0 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c  "both";.    } el
10fd0 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75  se {..proto = "u
10fe0 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20  nknown";.    }. 
10ff0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11000 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11010 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11020 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
11030 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
11040 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
11050 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11060 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11070 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11080 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31  ingObj(proto, -1
11090 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
110a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
110b0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
110c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
110d0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
110e0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
110f0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
11100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11130 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69  ----. *. * Versi
11140 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  onObjCmd -- retu
11150 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  rn version strin
11160 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  g from OpenSSL..
11170 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
11180 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
11190 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
111a0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
111b0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
111c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
11210 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65  rsionObjCmd(Clie
11220 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
11230 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
11240 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
11250 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
11260 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
11270 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
11280 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
11290 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50  led");..    objP
112a0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
112b0 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45  ngObj(OPENSSL_VE
112c0 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b  RSION_TEXT, -1);
112d0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
112e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
112f0 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75  jPtr);..    retu
11300 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
11310 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
11320 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a  ata;..objc = obj
11330 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b  c;..objv = objv;
11340 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
11390 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d  . * MiscObjCmd -
113a0 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a  - misc commands.
113b0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
113c0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
113d0 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
113e0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
113f0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69  */.static int.Mi
11450 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  scObjCmd(ClientD
11460 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
11470 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11480 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
11490 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
114a0 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69  v[]) {.    stati
114b0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
114c0 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
114d0 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e  eq", "strreq", N
114e0 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
114f0 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
11500 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d   C_STRREQ, C_DUM
11510 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d  MY };.    int cm
11520 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68  d, isStr;.    ch
11530 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d  ar buffer[16384]
11540 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
11550 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
11560 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
11570 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11580 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11590 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
115a0 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
115b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
115c0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
115d0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
115e0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
115f0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
11600 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43  ", 0,&cmd) != TC
11610 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
11620 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11630 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63  ..    isStr = (c
11640 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b  md == C_STRREQ);
11650 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
11660 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29  um command) cmd)
11670 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a   {..case C_REQ:.
11680 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20  .case C_STRREQ: 
11690 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20  {..    EVP_PKEY 
116a0 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *pkey=NULL;..   
116b0 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c   X509 *cert=NULL
116c0 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  ;..    X509_NAME
116d0 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20   *name=NULL;..  
116e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74    Tcl_Obj **list
116f0 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74  v;..    int list
11700 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  c,i;...    BIO *
11710 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
11720 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
11730 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
11740 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
11750 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
11760 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
11770 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
11780 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
11790 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
117a0 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50  ays=365;..#if OP
117b0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
117c0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
117d0 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a  0L..    BIGNUM *
117e0 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  bne = NULL;..   
117f0 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
11800 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50  ;.#else..    EVP
11810 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d  _PKEY_CTX *ctx =
11820 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09   NULL;.#endif...
11830 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
11840 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
11850 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
11860 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11870 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
11880 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
11890 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
118a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
118b0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
118c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
118d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
118e0 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
118f0 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
11900 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
11910 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
11920 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11930 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
11940 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
11950 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69  objv[4]);..    i
11960 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63  f (isStr) {...Tc
11970 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
11980 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09  keyout,"",0);...
11990 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
119a0 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,pemout,"",0);.
119b0 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
119c0 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66  (objc>=6) {...if
119d0 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
119e0 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
119f0 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69   objv[5],....&li
11a00 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
11a10 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
11a20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11a30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
11a40 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
11a50 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
11a60 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
11a70 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
11a80 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
11a90 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
11aa0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
11ab0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
11ac0 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
11ad0 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
11ae0 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
11af0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
11b00 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
11b10 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
11b20 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
11b30 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
11b40 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
11b50 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
11b60 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
11b70 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
11b80 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
11b90 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
11ba0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
11bb0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
11bc0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
11bd0 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
11be0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
11bf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
11c00 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
11c10 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
11c20 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
11c30 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
11c40 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
11c50 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
11c60 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
11c70 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
11c80 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
11c90 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
11ca0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
11cb0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
11cc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
11cd0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
11ce0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
11cf0 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
11d00 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
11d10 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
11d20 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
11d30 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
11d40 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
11d50 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
11d60 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
11d70 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
11d80 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
11d90 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
11da0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11db0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11dc0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
11dd0 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
11de0 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
11df0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
11e00 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
11e10 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
11e20 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11e30 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
11e40 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
11e50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11e60 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
11e70 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
11e80 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
11e90 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
11ea0 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
11eb0 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
11ec0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
11ed0 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
11ee0 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
11ef0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
11f00 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
11f10 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
11f20 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
11f30 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
11f40 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
11f50 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
11f60 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
11f70 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
11f80 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
11f90 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
11fa0 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
11fb0 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
11fc0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
11fd0 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
11fe0 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
11ff0 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
12000 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
12010 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
12020 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
12030 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
12040 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
12050 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
12060 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
12070 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
12080 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
12090 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
120a0 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
120b0 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
120c0 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
120d0 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
120e0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
120f0 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
12100 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
12110 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
12120 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
12130 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
12140 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
12150 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
12160 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
12170 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
12180 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
12190 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
121a0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
121b0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
121c0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
121d0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
121e0 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
121f0 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
12200 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
12210 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
12220 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
12230 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
12240 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
12250 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
12260 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
12270 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
12280 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
12290 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
122a0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
122b0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
122c0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
122d0 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
122e0 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
122f0 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
12300 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
12310 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
12320 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
12330 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
12340 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
12350 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
12360 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
12370 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
12380 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
12390 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
123a0 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
123b0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
123c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
123d0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
123e0 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
123f0 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
12400 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
12410 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
12420 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12430 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12440 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
12450 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
12460 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f   return(TCL_ERRO
12470 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  R);...}....X509_
12480 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74  set_version(cert
12490 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45  ,2);...ASN1_INTE
124a0 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74  GER_set(X509_get
124b0 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65  _serialNumber(ce
124c0 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58  rt),serial);...X
124d0 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
124e0 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f  509_getm_notBefo
124f0 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
12500 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
12510 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65  509_getm_notAfte
12520 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30  r(cert),(long)60
12530 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09  *60*24*days);...
12540 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28  X509_set_pubkey(
12550 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e  cert,pkey);....n
12560 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62  ame=X509_get_sub
12570 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b  ject_name(cert);
12580 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ....X509_NAME_ad
12590 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
125a0 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e  ame,"C", MBSTRIN
125b0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
125c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
125d0 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _C, -1, -1, 0);.
125e0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
125f0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
12600 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47  e,"ST", MBSTRING
12610 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12620 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12630 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  ST, -1, -1, 0);.
12640 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
12650 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
12660 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"L", MBSTRING_
12670 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
12680 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c  gned char *) k_L
12690 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
126a0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
126b0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
126c0 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "O", MBSTRING_AS
126d0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
126e0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20  ed char *) k_O, 
126f0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
12700 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
12710 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
12720 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  U", MBSTRING_ASC
12730 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
12740 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20  d char *) k_OU, 
12750 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
12760 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
12770 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
12780 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  N", MBSTRING_ASC
12790 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
127a0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20  d char *) k_CN, 
127b0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
127c0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
127d0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45  y_by_txt(name,"E
127e0 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  mail", MBSTRING_
127f0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
12800 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45  gned char *) k_E
12810 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  mail, -1, -1, 0)
12820 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75  ;....X509_set_su
12830 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c  bject_name(cert,
12840 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58  name);....if (!X
12850 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b  509_sign(cert,pk
12860 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29  ey,EVP_sha256())
12870 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66  ) {...    X509_f
12880 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20  ree(cert);...   
12890 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
128a0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
128b0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
128c0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
128d0 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
128e0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
128f0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
12900 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e  terp,"Error sign
12910 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22  ing certificate"
12920 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
12930 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12940 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72  ..}....if (isStr
12950 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
12960 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
12970 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
12980 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
12990 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d  ,cert);...    i=
129a0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
129b0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
129c0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
129d0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
129e0 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
129f0 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
12a00 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
12a10 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
12a20 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
12a30 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
12a40 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
12a50 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
12a60 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
12a70 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
12a80 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
12a90 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20  t,pemout);...   
12aa0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58   PEM_write_bio_X
12ab0 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09  509(out,cert);..
12ac0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c  .    BIO_free_al
12ad0 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58  l(out);...}....X
12ae0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
12af0 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
12b00 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
12b10 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12b20 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12b30 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
12b40 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d  #endif..    }..}
12b50 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ..break;.    def
12b60 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20  ault:..break;.  
12b70 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
12b80 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
12b90 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
12ba0 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
12bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
12bc0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
12bd0 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
12be0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
12bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c30 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
12c40 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
12c50 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
12c60 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
12c70 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
12c80 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
12c90 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
12ca0 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
12cb0 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
12cc0 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
12cd0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
12ce0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
12cf0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
12d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d40 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
12d50 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b  Free(char *block
12d60 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
12d70 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
12d80 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
12d90 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
12da0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
12db0 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
12dc0 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
12dd0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
12de0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e20 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
12e30 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
12e40 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
12e50 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
12e60 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
12e70 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
12e80 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
12e90 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
12ea0 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
12eb0 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
12ec0 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
12ed0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
12ee0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
12ef0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
12f00 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
12f10 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
12f20 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
12f30 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
12f40 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
12f50 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f90 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
12fa0 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
12fb0 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
12fc0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12fd0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
12fe0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
12ff0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
13000 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
13010 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
13020 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
13030 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
13040 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
13050 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
13060 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
13070 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
13080 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
13090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
130a0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
130b0 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
130c0 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
130d0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
130e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
130f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
13100 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
13110 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
13120 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
13130 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
13140 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
13150 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
13160 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
13170 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
13180 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
13190 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
131a0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
131b0 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
131c0 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
131d0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
131e0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
131f0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
13200 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
13210 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
13220 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
13230 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
13240 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
13250 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
13260 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
13270 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
13280 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
13290 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
132a0 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
132b0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
132c0 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
132d0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
132e0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
132f0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
13300 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
13310 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
13320 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
13330 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
13340 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
13350 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
13360 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
13370 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
13380 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
13390 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
133a0 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
133b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13400 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
13410 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
13420 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
13430 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
13440 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
13450 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
13460 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
13470 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
13480 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
13490 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
134a0 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
134b0 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
134c0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
134d0 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
134e0 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
134f0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
13500 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
13510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c  ---------. */.DL
13550 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
13560 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
13570 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63  *interp) {.    c
13580 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
13590 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
135a0 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
135b0 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
135c0 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  };..    dprintf(
135d0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
135e0 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  /*.     * We onl
135f0 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e  y support Tcl 8.
13600 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20  4 or newer.     
13610 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64  */.    if (.#ifd
13620 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
13630 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  ..Tcl_InitStubs(
13640 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
13650 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67  ).#else..Tcl_Pkg
13660 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
13670 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30  "Tcl", "8.4-", 0
13680 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55  ).#endif.. == NU
13690 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
136a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
136b0 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e      if (TlsLibIn
136c0 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
136d0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
136e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
136f0 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
13700 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
13710 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
13720 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13730 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
13740 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13750 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  p, "tls::ciphers
13760 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
13770 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
13780 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
13790 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
137a0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
137b0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
137c0 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
137d0 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
137e0 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
137f0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
13800 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
13810 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
13820 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13830 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
13840 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
13850 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
13860 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
13870 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
13880 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
13890 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
138a0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d  interp, "tls::im
138b0 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
138c0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
138d0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
138e0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
138f0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
13900 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13910 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72  p, "tls::unimpor
13920 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
13930 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
13940 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
13950 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
13960 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
13970 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13980 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  , "tls::status",
13990 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28   StatusObjCmd, (
139a0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
139b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
139c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
139d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
139e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
139f0 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
13a00 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
13a10 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
13a20 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
13a30 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
13a40 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
13a50 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
13a60 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d  misc", MiscObjCm
13a70 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
13a80 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
13a90 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
13aa0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
13ab0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13ac0 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
13ad0 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  ", ProtocolsObjC
13ae0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
13af0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
13b00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
13b10 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
13b20 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e  ) {..Tcl_Eval(in
13b30 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
13b40 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a  Script);.    }..
13b50 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50      return(Tcl_P
13b60 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
13b70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45  , "tls", PACKAGE
13b80 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f  _VERSION));.}../
13b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
13bd0 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d  *.Tls_SafeInit -
13be0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
13bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61  --------*. *.Sta
13c20 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20  ndard procedure 
13c30 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61  required by 'loa
13c40 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  d'.. *.Initializ
13c50 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f  es this extensio
13c60 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74  n for a safe int
13c70 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d  erpreter.. *.---
13c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
13cb0 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
13cc0 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c  s:. *..As of 'Tl
13cd0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65  s_Init'. *. *.Re
13ce0 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e  sult:. *..A stan
13cf0 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63  dard Tcl error c
13d00 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ode.. *. *------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d40 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  *. */.DLLEXPORT 
13d50 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74  int Tls_SafeInit
13d60 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
13d70 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e  erp) {.    dprin
13d80 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20  tf("Called");.  
13d90 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69    return(Tls_Ini
13da0 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f  t(interp));.}../
13db0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
13df0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a  *.TlsLibInit --.
13e00 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e30 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69  ------*. *.Initi
13e40 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
13e50 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
13e60 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d  ication. *.-----
13e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
13ea0 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
13eb0 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73  . *..initializes
13ec0 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a   SSL library. *.
13ed0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e   *.Result:. *..n
13ee0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
13ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
13f20 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
13f30 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75  TlsLibInit(int u
13f40 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20  ninitialize) {. 
13f50 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e     static int in
13f60 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20  itialized = 0;. 
13f70 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20     int status = 
13f80 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  TCL_OK;.#if defi
13f90 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
13fa0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
13fb0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
13fc0 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b   size_t num_lock
13fd0 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  s;.#endif..    i
13fe0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  f (uninitialize)
13ff0 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c   {..if (!initial
14000 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72  ized) {..    dpr
14010 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
14020 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74  ninitialize, but
14030 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74   we are not init
14040 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20  ialized");...   
14050 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b   return(TCL_OK);
14060 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41  ..}...dprintf("A
14070 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
14080 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66  lize");..#if def
14090 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
140a0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
140b0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
140c0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
140d0 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f  it_mx);...if (lo
140e0 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65  cks) {..    free
140f0 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f  (locks);..    lo
14100 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  cks = NULL;..   
14110 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b   locksCount = 0;
14120 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74  ..}.#endif..init
14130 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69  ialized = 0;..#i
14140 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
14150 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
14160 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
14170 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c  S)..Tcl_MutexUnl
14180 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
14190 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54  endif...return(T
141a0 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  CL_OK);.    }.. 
141b0 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a     if (initializ
141c0 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  ed) {..dprintf("
141d0 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e  Called, but usin
141e0 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29  g cached value")
141f0 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73  ;..return(status
14200 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  );.    }..    dp
14210 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
14220 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
14230 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
14240 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
14250 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d  READS).    Tcl_M
14260 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
14270 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  x);.#endif.    i
14280 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
14290 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
142a0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
142b0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
142c0 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f  EADS).    num_lo
142d0 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  cks = 1;.    loc
142e0 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20  ksCount = (int) 
142f0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c  num_locks;.    l
14300 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  ocks = malloc(si
14310 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
14320 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d  um_locks);.    m
14330 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20  emset(locks, 0, 
14340 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
14350 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e   num_locks);.#en
14360 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  dif..    /* Init
14370 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63  ialize BOTH libc
14380 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c  rypto and libssl
14390 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c  . */.    OPENSSL
143a0 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53  _init_ssl(OPENSS
143b0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f  L_INIT_LOAD_SSL_
143c0 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53  STRINGS | OPENSS
143d0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50  L_INIT_LOAD_CRYP
143e0 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50  TO_STRINGS..| OP
143f0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
14400 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45  LL_CIPHERS | OPE
14410 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
14420 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29  L_DIGESTS, NULL)
14430 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74  ;..    BIO_new_t
14440 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69  cl(NULL, 0);..#i
14450 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  f 0.    /*.     
14460 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f  * XXX:TODO: Remo
14470 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64  ve this code and
14480 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
14490 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20   a check.     * 
144a0 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f  for enough entro
144b0 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72  py and do not tr
144c0 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  y to create our 
144d0 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69  own.     * terri
144e0 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20  ble entropy.    
144f0 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   */.    /*.     
14500 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f  * Seed the rando
14510 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
14520 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69  or in the SSL li
14530 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73  brary,.     * us
14540 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65  ing the do/while
14550 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75   construct becau
14560 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f  se of the bug no
14570 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a  te in the.     *
14580 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20   OpenSSL FAQ at 
14590 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73  http://www.opens
145a0 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66  sl.org/support/f
145b0 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20  aq.html#USER1.  
145c0 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20     *.     * The 
145d0 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62  crux of the prob
145e0 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61  lem is that Sola
145f0 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68  ris 7 does not h
14600 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65  ave a.     * /de
14610 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76  v/random or /dev
14620 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20  /urandom device 
14630 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74  so it cannot gat
14640 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20  her enough.     
14650 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74  * entropy from t
14660 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77  he RAND_seed() w
14670 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69  hen TLS initiali
14680 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a  zes and refuses.
14690 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72       * to go fur
146a0 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65  ther. Earlier ve
146b0 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53  rsions of OpenSS
146c0 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67  L carried on reg
146d0 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f  ardless..     */
146e0 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69  .    srand((unsi
146f0 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28  gned int) time((
14700 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29  time_t *) NULL))
14710 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20  ;.    do {..for 
14720 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20  (i = 0; i < 16; 
14730 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f  i++) {..    rnd_
14740 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63  seed[i] = 1 + (c
14750 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61  har) (255.0 * ra
14760 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31  nd()/(RAND_MAX+1
14770 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73  .0));..}..RAND_s
14780 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69  eed(rnd_seed, si
14790 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b  zeof(rnd_seed));
147a0 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41  .    } while (RA
147b0 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31  ND_status() != 1
147c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  );.#endif..#if d
147d0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
147e0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
147f0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
14800 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
14810 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
14820 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74  if...return(stat
14830 75 73 29 3b 0a 7d 0a                             us);.}.