Hex Artifact Content

Artifact 42a5997f512b3e980e85078041d59260e24c7ff4c47693ac4de934ae47e721b5:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c  ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65  = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29  rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20     ok = 1;..}.  
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45    } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68  rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  }..    Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20   * InfoCallback 
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52   process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f  static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20  re, int ret) {. 
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70   *minor;..    dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66  .return;..    if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54  _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20   = "start";.    
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a  AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65  ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f  _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c  r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d  SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22  ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50  e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63  T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26  ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d   SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09  inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09   SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b  minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09   & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b  .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09   & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b  .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72  ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bd0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09  .ver = "none";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1bf0: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e  lt:..ver = "unkn
1c00: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  own";..break;.  
1c10: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
1c20: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b  (content_type) {
1c30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1c40: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20  T_HEADER:..type 
1c50: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65  = "Header";..bre
1c60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c70: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45  3_RT_INNER_CONTE
1c80: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d  NT_TYPE:..type =
1c90: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20   "Inner Content 
1ca0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  Type";..break;. 
1cb0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1cc0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50  CHANGE_CIPHER_SP
1cd0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61  EC:..type = "Cha
1ce0: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72  nge Cipher";..br
1cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1d00: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79  L3_RT_ALERT:..ty
1d10: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62  pe = "Alert";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d30: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45  SL3_RT_HANDSHAKE
1d40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73  :..type = "Hands
1d50: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  hake";..break;. 
1d60: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1d70: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41  APPLICATION_DATA
1d80: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44  :..type = "App D
1d90: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ata";..break;.  
1da0: 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f    case DTLS1_RT_
1db0: 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65  HEARTBEAT:..type
1dc0: 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a   = "Heartbeat";.
1dd0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
1de0: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1df0: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e00: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e10: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e20: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e30: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e40: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e50: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e60: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e70: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1e80: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1e90: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ea0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1eb0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ec0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ed0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1ee0: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1ef0: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f00: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f10: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f20: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f  flush(bio);..BIO
1f30: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d  _free(bio);.   }
1f40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1f50: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
1f60: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
1f70: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
1f80: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1f90: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
1fa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1fb0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1fc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1fd0: 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d  Obj("message", -
1fe0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1ff0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2000: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2010: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
2020: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
2030: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
2040: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
2050: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2070: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2090: 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22  write_p ? "Sent"
20a0: 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d   : "Received", -
20b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
20c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
20d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
20e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
20f0: 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20  bj(ver, -1));.  
2100: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2110: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2120: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2130: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65  ewStringObj(type
2140: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2150: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2160: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2170: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2180: 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31  ngObj(buffer, -1
2190: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
21a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
21b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
21c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
21d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
21e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
21f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
2200: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2210: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23  unt(cmdPtr);.}.#
2220: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  endif.../*. *---
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c  . *. * VerifyCal
2280: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
2290: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74  onitors SSL cert
22a0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69  ificate validati
22b0: 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64  on process. Used
22c0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a   to control the.
22d0: 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e   *.behavior when
22e0: 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f   the SSL_VERIFY_
22f0: 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74  PEER flag is set
2300: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
2310: 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63  . *.whenever a c
2320: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e  ertificate is in
2330: 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64  spected or decid
2340: 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c  ed invalid. Call
2350: 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63  ed for. *.each c
2360: 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68  ertificate in th
2370: 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a  e cert chain.. *
2380: 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63  . * Checks:. *.c
2390: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e  ertificate chain
23a0: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72   is checked star
23b0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65  ting with the de
23c0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65  epest nesting le
23d0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f  vel. *.  (the ro
23e0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74  ot CA certificat
23f0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70  e) and worked up
2400: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72  ward to the peer
2410: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a  's certificate..
2420: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65   *.All signature
2430: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72  s are valid, cur
2440: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74  rent time is wit
2450: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61  hin first and la
2460: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65  st validity time
2470: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20  .. *.Check that 
2480: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2490: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65  is issued by the
24a0: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63   issuer certific
24b0: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43  ate issuer.. *.C
24c0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74  heck the revocat
24d0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65  ion status for e
24e0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e  ach certificate.
24f0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61  . *.Check the va
2500: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69  lidity of the gi
2510: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20  ven CRL and the 
2520: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20  cert revocation 
2530: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b  status.. *.Check
2540: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66   the policies of
2550: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69   all the certifi
2560: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73  cates. *. * Args
2570: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b  . *.preverify_ok
2580: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68   indicates wheth
2590: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61  er the certifica
25a0: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  te verification 
25b0: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f  passed (1) or no
25c0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75  t (0). *. * Resu
25d0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61  lts:. *.A callba
25e0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ck bound to the 
25f0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72  socket may retur
2600: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20  n one of:. *.   
2610: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   0...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
2630: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76   invalid, send v
2640: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09  erification. *..
2650: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72  ..  failure aler
2660: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74  t to peer, and t
2670: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61  erminate handsha
2680: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d  ke.. *.    1...-
2690: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
26a0: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64   is deemed valid
26b0: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  , continue with 
26c0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20  handshake.. *.  
26d0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d    empty string.-
26e0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65   no change to ce
26f0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
2700: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  tion. *. * Side 
2710: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2720: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2730: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2740: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
2750: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
2760: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
2770: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2780: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2790: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
27e0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43  atic int.VerifyC
27f0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20  allback(int ok, 
2800: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a  X509_STORE_CTX *
2810: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ctx) {.    Tcl_O
2820: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
2830: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53  SSL   *ssl..= (S
2840: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43  SL*)X509_STORE_C
2850: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63  TX_get_ex_data(c
2860: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64  tx, SSL_get_ex_d
2870: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43  ata_X509_STORE_C
2880: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58  TX_idx());.    X
2890: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
28a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
28b0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
28c0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
28d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
28e0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
28f0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c  ta(ssl);.    Tcl
2900: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2910: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2920: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74  rp;.    int dept
2930: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  h..= X509_STORE_
2940: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65  CTX_get_error_de
2950: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e  pth(ctx);.    in
2960: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54  t err..= X509_ST
2970: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f  ORE_CTX_get_erro
2980: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72  r(ctx);..    dpr
2990: 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 64  intf("Verify: %d
29a0: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20  ", ok);..    if 
29b0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
29c0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
29d0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50  L) {..if (stateP
29e0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c  tr->vflags & SSL
29f0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
2a00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
2a10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
2a20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2a30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20  eturn 1;..}.    
2a40: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
2a50: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d  == NULL || ssl =
2a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2a70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
2a80: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
2a90: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
2aa0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2ab0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2ac0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
2ad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2ae0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2af0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2b00: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
2b10: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b40: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2b50: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2b60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2b70: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ba0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2bb0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
2bc0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
2bd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2be0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2bf0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
2c00: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
2c10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2c20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c40: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2c90: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76  bj((char*)X509_v
2ca0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
2cb0: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
2cc0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76  ));..    /* Prev
2cd0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61  ent I/O while ca
2ce0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f  llback is in pro
2cf0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20  gress */.    /* 
2d00: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2d10: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42  |= TLS_TCL_CALLB
2d20: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ACK; */..    /* 
2d30: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2d40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2d50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2d60: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  dPtr);.    ok = 
2d70: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2d80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2da0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2db0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74  Ptr);..    /* st
2dc0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
2dd0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   ~(TLS_TCL_CALLB
2de0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  ACK); */.    ret
2df0: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64  urn(ok);./* By d
2e00: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65  efault, leave ve
2e10: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61  rification uncha
2e20: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a  nged. */.}.../*.
2e30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
2e80: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43  Error --. *. *.C
2e90: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  alls callback wi
2ea0: 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72  th list of error
2eb0: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  s.. *. * Side ef
2ec0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72  fects:. *.The er
2ed0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  r field of the c
2ee0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69  urrently operati
2ef0: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a  ve State is set.
2f00: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67   *.  to a string
2f10: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
2f20: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
2f30: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20  failure reason. 
2f40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
2f90: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65  .Tls_Error(State
2fa0: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72   *statePtr, char
2fb0: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c   *msg) {.    Tcl
2fc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2fd0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2fe0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
2ff0: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74  *cmdPtr, *listPt
3000: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  r;.    unsigned 
3010: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74  long err;.    st
3020: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73  atePtr->err = ms
3030: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
3040: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
3050: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
3060: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
3070: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
3080: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  n;..    /* Creat
3090: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
30a0: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
30b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
30c0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
30d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
30e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
30f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3110: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d  ngObj("error", -
3120: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
3130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3140: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3150: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
3160: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
3170: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
3180: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
3190: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d  ;.    if (msg !=
31a0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69   NULL) {..Tcl_Li
31b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
31c0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
31d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
31e0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a  Obj(msg, -1));..
31f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
3200: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  msg = Tcl_GetStr
3210: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3220: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3230: 72 70 29 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a  rp), (Tcl_Size *
3240: 29 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29  )NULL)) != NULL)
3250: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3260: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3270: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3280: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3290: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
32a0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20  else {..listPtr 
32b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
32c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c  (0, NULL);..whil
32d0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65  e ((err = ERR_ge
32e0: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29  t_error()) != 0)
32f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
3300: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3310: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
3320: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3330: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  bj(ERR_reason_er
3340: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
3350: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c   -1));..}..Tcl_L
3360: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3370: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3380: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20  tr, listPtr);.  
3390: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c    }..    /* Eval
33a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
33b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
33c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
33d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
33e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
33f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
3400: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3410: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c  unt(cmdPtr);.}..
3420: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3470: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d  KeyLogCallback -
3480: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65  -. *. *.Write re
3490: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20  ceived key data 
34a0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a  to log file.. *.
34b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
34c0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f  -. */.void KeyLo
3520: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  gCallback(const 
3530: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
3540: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20  char *line) {.  
3550: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65    char *str = ge
3560: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
3570: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66  LE);.    FILE *f
3580: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
3590: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
35a0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d  if (str) {..fd =
35b0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29   fopen(str, "a")
35c0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22  ;..fprintf(fd, "
35d0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63  %s\n",line);..fc
35e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
35f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3640: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c   * Password Call
3650: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  back --. *. *.Ca
3660: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
3670: 77 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61  word for a priva
3680: 74 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73  te key loading/s
3690: 74 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09  toring a PEM. *.
36a0: 63 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68  certificate with
36b0: 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61   encryption. Eva
36c0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  ls callback scri
36d0: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20  pt and returns. 
36e0: 2a 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  *.the result as 
36f0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72  the password str
3700: 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20  ing in buf.. *. 
3710: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
3720: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
3730: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
3740: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
3750: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
3760: 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64  rns:. *.Password
3770: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
3780: 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f  r -1 for an erro
3790: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  r.. *. *--------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
37e0: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77  static int.Passw
37f0: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72  ordCallback(char
3800: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c   *buf, int size,
3810: 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69   int rwflag, voi
3820: 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20  d *udata) {.    
3830: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
3840: 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74  = (State *) udat
3850: 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  a;.    Tcl_Inter
3860: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
3870: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
3880: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
3890: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b  r;.    int code;
38a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
38b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
38c0: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c   If no callback,
38d0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c   use default cal
38e0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20  lback */.    if 
38f0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
3900: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ord == NULL) {..
3910: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69  if (Tcl_EvalEx(i
3920: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73  nterp, "tls::pas
3930: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f  sword", -1, TCL_
3940: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20  EVAL_GLOBAL) == 
3950: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63  TCL_OK) {..    c
3960: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3970: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3980: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
3990: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75  ..    strncpy(bu
39a0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
39b0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74   size);..    ret
39c0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  urn (int)strlen(
39d0: 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ret);..} else {.
39e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
39f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
3a00: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
3a10: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63  to eval */.    c
3a20: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
3a30: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
3a40: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20  r->password);.  
3a50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3a60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3a70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3a80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73  ewStringObj("pas
3a90: 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20  sword", -1));.  
3aa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3ac0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3ad0: 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29  ewIntObj(rwflag)
3ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3b10: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69  Tcl_NewIntObj(si
3b20: 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  ze));..    Tcl_P
3b30: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
3b40: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
3b50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3b70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  ePtr);..    /* E
3b80: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
3b90: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
3ba0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
3bb0: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  Ptr);.    code =
3bc0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
3bd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3be0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
3bf0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d  .    if (code !=
3c00: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28   TCL_OK) {.#if (
3c10: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
3c20: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
3c30: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
3c40: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
3c50: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
3c60: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
3c70: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
3c80: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
3c90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
3ca0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3cb0: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54  (cmdPtr);..    T
3cc0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3cd0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
3ce0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75  );..    /* If su
3cf0: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62  ccessful, pass b
3d00: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72  ack password str
3d10: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65  ing and truncate
3d20: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a   if too long */.
3d30: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
3d40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53  TCL_OK) {..Tcl_S
3d50: 69 7a 65 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a  ize len;..char *
3d60: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3d80: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3d90: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c  sult(interp), &l
3da0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20  en);..if (len > 
3db0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d  (Tcl_Size) size-
3dc0: 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20  1) {..    len = 
3dd0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d  (Tcl_Size) size-
3de0: 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 62  1;..}..strncpy(b
3df0: 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74  uf, ret, (size_t
3e00: 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e  ) len);..buf[len
3e10: 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52  ] = '\0';..Tcl_R
3e20: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3e30: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65  ta) interp);..re
3e40: 74 75 72 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b  turn((int) len);
3e50: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52  .    }.    Tcl_R
3e60: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3e70: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
3e80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a   return -1;.}...
3e90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
3ee0: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20  ession Callback 
3ef0: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20  for Clients --. 
3f00: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
3f10: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69   a new session i
3f20: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
3f30: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33  ache. In TLS 1.3
3f40: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20  . *.this may be 
3f50: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
3f60: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68  e times after th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72  e handshake. For
3f80: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73  . *.earlier vers
3f90: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  ions, this will 
3fa0: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69  be received duri
3fb0: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ng the handshake
3fc0: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65  .. *.This is the
3fd0: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74   preferred way t
3fe0: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d  o obtain a resum
3ff0: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a  able session.. *
4000: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
4010: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
4020: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
4030: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
4040: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
4050: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30  turn codes:. *.0
4060: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73   = error where s
4070: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69  ession will be i
4080: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76  mmediately remov
4090: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ed from the inte
40a0: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31  rnal cache.. *.1
40b0: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65   = success where
40c0: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73   app retains ses
40d0: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20  sion in session 
40e0: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20  cache, and must 
40f0: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  call SSL_SESSION
4100: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e  _free() when don
4110: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4160: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69  static int.Sessi
4170: 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  onCallback(const
4180: 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53   SSL *ssl, SSL_S
4190: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29  ESSION *session)
41a0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
41b0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
41c0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
41d0: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
41e0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
41f0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
4200: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
4210: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
4220: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4230: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
4240: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4250: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
4260: 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  _id;.    size_t 
4270: 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e  len2;.    unsign
4280: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20  ed int ulen;..  
4290: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
42a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
42b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
42c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
42d0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
42e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
42f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
4300: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl == NULL) {..
4310: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4320: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
4330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4340: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
4350: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
4360: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
4370: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
4380: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
4390: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
43a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
43b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
43c0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c  ngObj("session",
43d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
43e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
43f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4400: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
4410: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
4420: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
4430: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
4440: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
4450: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65  ion id */.    se
4460: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
4470: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
4480: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20  ssion, &ulen);. 
4490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
44a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
44b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
44c0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
44d0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
44e0: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a  _Size) ulen));..
44f0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74      /* Session t
4500: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  icket */.    SSL
4510: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
4520: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74  cket(session, &t
4530: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20  icket, &len2);. 
4540: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4550: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4560: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4570: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
4580: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
4590: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20  e) len2));..    
45a0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75  /* Lifetime - nu
45b0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
45c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
45d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
45e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
45f0: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28  .Tcl_NewLongObj(
4600: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49  (long) SSL_SESSI
4610: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
4620: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
4630: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ion)));..    /* 
4640: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
4650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
4660: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
4670: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
4680: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
4690: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
46a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
46b0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
46c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
46d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4720: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20  * ALPN Callback 
4730: 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20  for Servers and 
4740: 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  NPN Callback for
4750: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20   Clients --. *. 
4760: 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63  *.Perform protoc
4770: 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32  ol (http/1.1, h2
4780: 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65  , h3, etc.) sele
4790: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a  ction for the. *
47a0: 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63  .incoming connec
47b0: 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74  tion. Called aft
47c0: 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72  er Hello and ser
47d0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ver callbacks.. 
47e0: 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73  *.Where 'out' is
47f0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
4800: 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74  ol and 'in' is t
4810: 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73  he peer advertis
4820: 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52  ed list.. *. * R
4830: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
4840: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4850: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
4860: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4870: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4880: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
4890: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50  SEXT_ERR_OK: ALP
48a0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  N protocol selec
48b0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
48c0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
48d0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
48e0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68  _ALERT_FATAL: Th
48f0: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c  ere was no overl
4900: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  ap between the c
4910: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73  lient's. *.    s
4920: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64  upplied list and
4930: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66   the server conf
4940: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63  iguration. The c
4950: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62  onnection will b
4960: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53  e aborted.. *.SS
4970: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
4980: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  CK: ALPN protoco
4990: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20  l not selected, 
49a0: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f  e.g., because no
49b0: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f   ALPN. *.    pro
49c0: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69  tocols are confi
49d0: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63  gured for this c
49e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63  onnection. The c
49f0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
4a00: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50  /.static int.ALP
4a60: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  NCallback(const 
4a70: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
4a80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
4a90: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  out, unsigned ch
4aa0: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e  ar *outlen,..con
4ab0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4ac0: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69   *in, unsigned i
4ad0: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a  nt inlen, void *
4ae0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
4af0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
4b00: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
4b10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4b20: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4b30: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4b40: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
4b50: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20  t code, res;..  
4b60: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
4b70: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
4b80: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
4b90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
4ba0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4bb0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4bc0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70  .    /* Select p
4bd0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69  rotocol */.    i
4be0: 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65  f (SSL_select_ne
4bf0: 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75  xt_proto(out, ou
4c00: 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e  tlen, statePtr->
4c10: 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72  protos, statePtr
4c20: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69  ->protos_len,..i
4c30: 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45  n, inlen) == OPE
4c40: 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41  NSSL_NPN_NEGOTIA
4c50: 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68  TED) {../* Match
4c60: 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d   found */..res =
4c70: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4c80: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
4c90: 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e  ../* OPENSSL_NPN
4ca0: 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f  _NO_OVERLAP = No
4cb0: 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65   overlap, so use
4cc0: 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d   first item from
4cd0: 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c   client protocol
4ce0: 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20   list */..res = 
4cf0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4d00: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
4d10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
4d20: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
4d30: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
4d40: 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   res;.    }..   
4d50: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
4d60: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
4d70: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
4d80: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
4d90: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
4da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4db0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4dc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
4de0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
4df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4e10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
4e20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
4e30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
4e40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
4e50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4e60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4e70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4e80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4e90: 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a  Obj(*out, -1));.
4ea0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4eb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4ec0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4ed0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
4ee0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
4ef0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
4f00: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
4f10: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
4f20: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4f30: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
4f40: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
4f50: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
4f60: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
4f70: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
4f80: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4f90: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
4fa0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
4fb0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
4fc0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4fd0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
4fe0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4ff0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
5000: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5010: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5020: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5030: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5080: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
5090: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
50a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
50b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
50c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
50d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
50e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
50f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
5100: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5110: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5120: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5130: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5140: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5150: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5160: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5170: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5180: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5190: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
51a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
51b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
51c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
51d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
51e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
51f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5200: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5210: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5260: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5270: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
5280: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5290: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
52a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
52b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
52c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
52d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
52e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
52f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
5300: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5310: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5320: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5330: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5340: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5350: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5360: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5370: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
5380: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
5390: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
53a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
53b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
53c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
53d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
53e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
53f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
5400: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5410: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5420: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5430: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5440: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
54a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
54b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
54c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
54d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
54e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
54f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
5500: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5510: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5520: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5530: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5540: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5550: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5560: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5570: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
5580: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
5590: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
55a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
55b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
55c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
55d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
55e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
55f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5600: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5610: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5620: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5630: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5640: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5650: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5660: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5670: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5680: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
5690: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
56a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
56b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
56c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
56d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
56e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
56f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
5700: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5710: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5720: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5730: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5740: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5750: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5760: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5770: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
5780: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
5790: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
57a0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
57f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5800: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5810: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5820: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5830: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5840: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5850: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5860: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5870: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5880: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5890: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
58a0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72 20  , res;.    char 
58b0: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55  *servername = NU
58c0: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  LL;..    dprintf
58d0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
58e0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
58f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
5900: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5910: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
5930: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c  nly works for TL
5940: 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65  S 1.2 and earlie
5950: 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e  r */.    servern
5960: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ame = SSL_get_se
5970: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
5980: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
5990: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  st_name);.    if
59a0: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c   (!servername ||
59b0: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d   servername[0] =
59c0: 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72  = '\0') {..retur
59d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
59e0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
59f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5a00: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
5a10: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
5a20: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5a30: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  R_OK;.    }..   
5a40: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
5a50: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
5a60: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5a70: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5a80: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5a90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5aa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5ad0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5ae0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5af0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5b00: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5b10: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5b20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5b30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5b40: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5b50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5b60: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5b70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5b80: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5b90: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5ba0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5bb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5bc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5bd0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5be0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5bf0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5c00: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5c10: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5c20: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5c30: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
5c40: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5c50: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5c60: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5c70: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5c80: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5c90: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5ca0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5cb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5cc0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5cd0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
5ce0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5cf0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5d00: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
5d10: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
5d20: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
5d30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5d40: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
5d50: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
5d60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
5db0: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
5dc0: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
5dd0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
5de0: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
5df0: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
5e00: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
5e10: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
5e20: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
5e30: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
5e40: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
5e50: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
5e60: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
5e70: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
5e80: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
5e90: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
5ea0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
5eb0: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
5ec0: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
5ed0: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
5ee0: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
5ef0: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
5f00: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
5f10: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
5f20: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
5f30: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
5f40: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
5f50: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
5f60: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
5f70: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
5f80: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
5f90: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
5fa0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
5fb0: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
5fc0: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
5fd0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5fe0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5ff0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
6000: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
6010: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
6020: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
6030: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6040: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
6050: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
6060: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
6070: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
6080: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
6090: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
60a0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
60b0: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
60c0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
60d0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
60e0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
60f0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
6100: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
6160: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f  HelloCallback(co
6170: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
6180: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
6190: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
61a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
61b0: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
61c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
61d0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
61e0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
61f0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
6200: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
6210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
6220: 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  vername;.    con
6230: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
6240: 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20   *p;.    size_t 
6250: 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a  len, remaining;.
6260: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
6270: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
6280: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
6290: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
62a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
62b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
62c0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
62d0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f  e if (ssl == (co
62e0: 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c  nst SSL *)NULL |
62f0: 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a  | arg == (void *
6300: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
6310: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6320: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  O_ERROR;.    }..
6330: 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73      /* Get names
6340: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
6350: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65  _client_hello_ge
6360: 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45  t0_ext(ssl, TLSE
6370: 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e  XT_TYPE_server_n
6380: 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e  ame, &p, &remain
6390: 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e  ing) || remainin
63a0: 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72  g <= 2) {..*aler
63b0: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
63c0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
63d0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
63e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
63f0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  O_ERROR;.    }..
6400: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
6410: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6420: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f   supplied list o
6430: 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  f names. */.    
6440: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c  len = (*(p++) <<
6450: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20   8);.    len += 
6460: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28  *(p++);.    if (
6470: 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69  len + 2 != remai
6480: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20  ning) {..*alert 
6490: 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c  = SSL_R_SSLV3_AL
64a0: 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41  ERT_ILLEGAL_PARA
64b0: 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53  METER;..return S
64c0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
64d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
64e0: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
64f0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  ;..    /* The li
6500: 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f  st in practice o
6510: 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65  nly has a single
6520: 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20   element, so we 
6530: 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68  only consider th
6540: 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a  e first one. */.
6550: 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e      if (remainin
6560: 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21  g == 0 || *p++ !
6570: 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  = TLSEXT_NAMETYP
6580: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09  E_host_name) {..
6590: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
65a0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
65b0: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
65c0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
65d0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
65e0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d  .    remaining--
65f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65  ;..    /* Now we
6600: 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c   can finally pul
6610: 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61  l out the byte a
6620: 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63  rray with the ac
6630: 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a  tual hostname. *
6640: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6650: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
6660: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6670: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6680: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6690: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
66a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
66b0: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
66c0: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
66d0: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
66e0: 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61   (len + 2 > rema
66f0: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74  ining) {..*alert
6700: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6710: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6720: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6730: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6740: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6750: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a  emaining = len;.
6760: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
6770: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6780: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
6790: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
67a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
67b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
67c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
67d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
67e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
67f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
6800: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6810: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a  ("hello", -1));.
6820: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6840: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
6850: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
6860: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
6870: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
6880: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
6890: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
68a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
68b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
68c0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65  wStringObj(serve
68d0: 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65  rname, (Tcl_Size
68e0: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a  ) len));..    /*
68f0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
6900: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
6910: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
6920: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  mdPtr);.    if (
6930: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c  (code = EvalCall
6940: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
6950: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20  tePtr, cmdPtr)) 
6960: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  > 1) {..res = SS
6970: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6980: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  ETRY;..*alert = 
6990: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
69a0: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44  T_USER_CANCELLED
69b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
69c0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
69d0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
69e0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20  HELLO_SUCCESS;. 
69f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
6a00: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6a10: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65  LLO_ERROR;..*ale
6a20: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6a30: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6a40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6a50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
6a60: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
6a70: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64  ****/./* Command
6aa0: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a  s         */./**
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ac0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6b10: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  . * CiphersObjCm
6b20: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
6b30: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20  ble ciphers. *. 
6b40: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
6b50: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
6b60: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
6b70: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e  :ciphers" comman
6b80: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
6b90: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20  ilable ciphers, 
6ba0: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f  based upon proto
6bb0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a  col selected.. *
6bc0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
6bd0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
6be0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
6bf0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6c00: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e   *.constructs an
6c10: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63  d destroys SSL c
6c20: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
6c30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
6c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
6c90: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73  tocols[] = {.."s
6ca0: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74  sl2", "ssl3", "t
6cb0: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20  ls1", "tls1.1", 
6cc0: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e  "tls1.2", "tls1.
6cd0: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d  3", NULL.};.enum
6ce0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20   protocol {.    
6cf0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53  TLS_SSL2, TLS_SS
6d00: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c  L3, TLS_TLS1, TL
6d10: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c  S_TLS1_1, TLS_TL
6d20: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33  S1_2, TLS_TLS1_3
6d30: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73  , TLS_NONE.};..s
6d40: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72  tatic int.Cipher
6d50: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
6d60: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
6d70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6d80: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
6d90: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
6da0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
6db0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
6dc0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
6dd0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
6de0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
6df0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
6e00: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
6e10: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b    char *cp, buf[
6e20: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74  BUFSIZ];.    int
6e30: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20   index, verbose 
6e40: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74  = 0, use_support
6e50: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ed = 0;.    cons
6e60: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
6e70: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
6e80: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
6e90: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32     if ((objc < 2
6ea0: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
6eb0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
6ec0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
6ed0: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  objv, "protocol 
6ee0: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f  ?verbose? ?suppo
6ef0: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e  rted?");..return
6f00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6f10: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
6f20: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
6f30: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70  terp, objv[1], p
6f40: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f  rotocols, "proto
6f50: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  col", 0, &index)
6f60: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
6f70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6f80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
6f90: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c  objc > 2) && Tcl
6fa0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
6fb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
6fc0: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d  2], &verbose) !=
6fd0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6fe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6ff0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7000: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65  c > 3) && Tcl_Ge
7010: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
7020: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
7030: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   &use_supported)
7040: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
7050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
7070: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
7080: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
7090: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78  m protocol)index
70a0: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  ) {..case TLS_SS
70b0: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  L2:.#if OPENSSL_
70c0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
70d0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
70e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
70f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20  NSSL_NO_SSL2).. 
7110: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7130: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7140: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7150: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7160: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7170: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7180: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76     method = SSLv
7190: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
71a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
71b0: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65  TLS_SSL3:.#if de
71c0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
71d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
71e0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  L_NO_SSL3) || de
71f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7200: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20  _SSL3_METHOD).. 
7210: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7230: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7240: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7250: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7260: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7270: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7280: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76     method = SSLv
7290: 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  3_method(); brea
72a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
72b0: 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65  TLS_TLS1:.#if de
72c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
72d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
72e0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  L_NO_TLS1) || de
72f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7300: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20  _TLS1_METHOD).. 
7310: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7330: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7340: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7350: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7360: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7370: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7380: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76     method = TLSv
7390: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  1_method(); brea
73a0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
73b0: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20  TLS_TLS1_1:.#if 
73c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
73d0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
73e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
73f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7400: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
7410: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41  THOD)..    Tcl_A
7420: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7430: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
7440: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
7450: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
7460: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  , NULL);..    re
7470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7480: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f  #else..    metho
7490: 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68  d = TLSv1_1_meth
74a0: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
74b0: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
74c0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_2:.#if define
74d0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
74e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
74f0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7500: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7510: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
7520: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7530: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7540: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7550: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7560: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7570: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7580: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7590: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
75a0: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20  Sv1_2_method(); 
75b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
75c0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a  ase TLS_TLS1_3:.
75d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
75e0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
75f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7600: 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  1_3)..    Tcl_Ap
7610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7620: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7630: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7640: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7650: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7670: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7680: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7690: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
76a0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
76b0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
76c0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53  VERSION);..    S
76d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
76e0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
76f0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
7700: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  );..    break;.#
7710: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
7720: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7730: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20  S_method();..   
7740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7750: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7760: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
7770: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
7780: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7790: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52  Result(interp, R
77a0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
77b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
77c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73  R;.    }..    ss
77d0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29  l = SSL_new(ctx)
77e0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ;.    if (ssl ==
77f0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
7800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7810: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  p, REASON(), NUL
7820: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
7830: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
7840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7850: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73  ..    /* Use lis
7860: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77  t and order as w
7870: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20  ould be sent in 
7880: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72  a ClientHello or
7890: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63   all available c
78a0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66  iphers */.    if
78b0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
78c0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
78d0: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68  1_supported_ciph
78e0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20  ers(ssl);.    } 
78f0: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c  else {..sk = SSL
7900: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c  _get_ciphers(ssl
7910: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
7920: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a   (sk != NULL) {.
7930: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b  .if (!verbose) {
7940: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
7950: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
7960: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72   NULL);..    for
7970: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
7980: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e   sk_SSL_CIPHER_n
7990: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09  um(sk); i++) {..
79a0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45  .const SSL_CIPHE
79b0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49  R *c = sk_SSL_CI
79c0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69  PHER_value(sk, i
79d0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55  );...if (c == NU
79e0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09  LL) continue;...
79f0: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20  ./* cipher name 
7a00: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63  or (NONE) */...c
7a10: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  p = SSL_CIPHER_g
7a20: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66  et_name(c);...if
7a30: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72   (cp == NULL) br
7a40: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  eak;...Tcl_ListO
7a50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7a60: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
7a70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7a80: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  (cp, -1));..    
7a90: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7aa0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7ab0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7ac0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7ad0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7ae0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7af0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7b00: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7b10: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7b20: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7b30: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7b40: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7b50: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7b60: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7b70: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7b80: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7b90: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7ba0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7bb0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7bc0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7bd0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7be0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7bf0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7c00: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7c10: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7c20: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
7c30: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
7c40: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
7c50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
7c60: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
7c70: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
7c80: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
7c90: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
7ca0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
7cb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
7cc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7cd0: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
7ce0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
7cf0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
7d40: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  * ProtocolsObjCm
7d50: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
7d60: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a  ble protocols. *
7d70: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
7d80: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
7d90: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c   process the "tl
7da0: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f  s::protocols" co
7db0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
7dc0: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f   available proto
7dd0: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cols.. *. * Resu
7de0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
7df0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
7e00: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
7e10: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
7e20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
7e70: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c  tic int.Protocol
7e80: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
7e90: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
7ea0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7eb0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7ec0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7ed0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
7ee0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
7ef0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
7f00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
7f10: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72   != 1) {..Tcl_Wr
7f20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
7f30: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
7f40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7f50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
7f60: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
7f70: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
7f80: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
7f90: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50  , NULL);..#if OP
7fa0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
7fb0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
7fc0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
7fd0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
7fe0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
7ff0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  SL2).    Tcl_Lis
8000: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8010: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8020: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8030: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8040: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL2], -1));.#e
8050: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8060: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
8070: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8080: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8090: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
80a0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
80b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
80c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
80d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
80e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
80f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d  ols[TLS_SSL3], -
8100: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8110: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8120: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8130: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
8140: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8150: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
8160: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8180: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
81a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
81b0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  LS1], -1));.#end
81c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
81d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
81e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
81f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
8200: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8210: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
8220: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8230: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8240: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8250: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8260: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8270: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _1], -1));.#endi
8280: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8290: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
82a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
82b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
82c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
82d0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
82e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
82f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8300: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8310: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8320: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
8330: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  2], -1));.#endif
8340: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8350: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
8360: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8370: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f  TLS1_3).    Tcl_
8380: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8390: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
83a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
83b0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
83c0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29  TLS_TLS1_3], -1)
83d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
83e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
83f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
8400: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8410: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
8420: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
8430: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8480: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
8490: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63   --. *. *.This c
84a0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
84b0: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72  o verify whether
84c0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69   the handshake i
84d0: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72  s complete. *.or
84e0: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   not.. *. * Resu
84f0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
8500: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31  rd Tcl result. 1
8510: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65   means handshake
8520: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61   complete, 0 mea
8530: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20  ns pending.. *. 
8540: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
8550: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c   *.May force SSL
8560: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20   negotiation to 
8570: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20  take place.. *. 
8580: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
85d0: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  int HandshakeObj
85e0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
85f0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8600: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8610: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
8620: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
8630: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
8640: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f  l chan;        /
8650: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
8660: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
8670: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
8680: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f  atePtr;        /
8690: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
86a0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
86b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
86c0: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *errStr = NULL;.
86d0: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b      int ret = 1;
86e0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30  .    int err = 0
86f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8700: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
8710: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8720: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8730: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8740: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
8750: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
8760: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  );.    }..    ER
8770: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
8780: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
8790: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
87a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
87b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
87c0: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55  , (Tcl_Size *)NU
87d0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
87e0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
87f0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8800: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  {..return(TCL_ER
8810: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
8820: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
8830: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
8840: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
8850: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
8860: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
8870: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
8880: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
8890: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
88a0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
88b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
88c0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
88d0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
88e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
88f0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
8900: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
8910: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
8920: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
8930: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e  erp, "TLS", "HAN
8940: 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45  DSHAKE", "CHANNE
8950: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
8960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8970: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
8980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
8990: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
89a0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
89b0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
89c0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
89d0: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69  "Calling Tls_Wai
89e0: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20  tForConnect");. 
89f0: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69     ret = Tls_Wai
8a00: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
8a10: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a  ePtr, &err, 1);.
8a20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
8a30: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
8a40: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72  returned: %i", r
8a50: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  et);..    if (re
8a60: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65  t < 0 && ((state
8a70: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
8a80: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28  _TCL_ASYNC) && (
8a90: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29  err == EAGAIN)))
8aa0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79   {..dprintf("Asy
8ab0: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d  nc set and err =
8ac0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20   EAGAIN");..ret 
8ad0: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  = 0;.    } else 
8ae0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
8af0: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72  long result;..er
8b00: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
8b10: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
8b20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
8b30: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
8b40: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
8b50: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d  r || (*errStr ==
8b60: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53   0)) {..    errS
8b70: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72  tr = Tcl_PosixEr
8b80: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ror(interp);..}.
8b90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
8bb0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
8bc0: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a   errStr, (char *
8bd0: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72  ) NULL);..if ((r
8be0: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f  esult = SSL_get_
8bf0: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
8c00: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d  atePtr->ssl)) !=
8c10: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20   X509_V_OK) {.. 
8c20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8c30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75  ult(interp, " du
8c40: 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65  e to: ", X509_ve
8c50: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
8c60: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20  string(result), 
8c70: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8c80: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  .}..Tcl_SetError
8c90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8ca0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8cb0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
8cc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69   *) NULL);..dpri
8cd0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
8ce0: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61  CL_ERROR with ha
8cf0: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
8d00: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72  %s", errStr);..r
8d10: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8d20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
8d30: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a  if (err != 0) {.
8d40: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
8d50: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20  t an error with 
8d60: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64  a completed hand
8d70: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22  shake: err = %i"
8d80: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20  , err);..}..ret 
8d90: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
8da0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8db0: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64  ng TCL_OK with d
8dc0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74  ata \"%i\"", ret
8dd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
8de0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8df0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
8e00: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  t));.    return(
8e10: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74  TCL_OK);..client
8e20: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
8e30: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  a;.}../*. *-----
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8e80: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
8e90: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
8ea0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
8eb0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
8ec0: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
8ed0: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
8ee0: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
8ef0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
8f00: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
8f10: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
8f20: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
8f30: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
8f40: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8f50: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
8f60: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
8f70: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
8f80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8fd0: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
8fe0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
8ff0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
9000: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9010: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
9020: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
9030: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
9040: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
9050: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
9060: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
9070: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
9080: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
9090: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
90a0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
90b0: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20  TX *ctx.        
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
90d0: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20  Obj *script.    
90e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
90f0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72  Tcl_Obj *passwor
9100: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
9110: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  ;.    Tcl_Obj *v
9120: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  cmd.        = NU
9130: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
9140: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
9150: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
9160: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9170: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9180: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
9190: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
91a0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54    int idx;.    T
91b0: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20  cl_Size len;.   
91c0: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20   int flags..    
91d0: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e      = TLS_TCL_IN
91e0: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76  IT;.    int serv
91f0: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b  er..        = 0;
9200: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f  ./* is connectio
9210: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75  n incoming or ou
9220: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63  tgoing? */.    c
9230: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20  har *keyfile.   
9240: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9250: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09   char *certfile.
9260: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9270: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9280: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b  r *key  .= NULL;
9290: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65  .    Tcl_Size ke
92a0: 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  y_len           
92b0: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75        = 0;.    u
92c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
92d0: 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt         = NUL
92e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
92f0: 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20  cert_len        
9300: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
9310: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20   char *ciphers. 
9320: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9330: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
9340: 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20  uites.        = 
9350: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9360: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  CAfile.        =
9370: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9380: 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20  *CAdir..        
9390: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
93a0: 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20   *DHparams.     
93b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
93c0: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20  har *model..    
93d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
93e0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
93f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9400: 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72  ./* hostname for
9410: 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64   Server Name Ind
9420: 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ication */.    c
9430: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9440: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d  ar *session_id =
9450: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
9460: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c  bj *alpn..= NULL
9470: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d  ;.    int ssl2 =
9480: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20   0, ssl3 = 0;.  
9490: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20    int tls1 = 1, 
94a0: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31  tls1_1 = 1, tls1
94b0: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d  _2 = 1, tls1_3 =
94c0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74   1;.    int prot
94d0: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d  o = 0, level = -
94e0: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66  1;.    int verif
94f0: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d  y = 0, require =
9500: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c   0, request = 1,
9510: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
9520: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
9530: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
9540: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
9550: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
9560: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20  ENSSL_NO_TLS1). 
9570: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e     tls1 = 0;.#en
9580: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
9590: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
95a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
95b0: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73  _TLS1_1).    tls
95c0: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  1_1 = 0;.#endif.
95d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
95e0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
95f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
9600: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20  1_2).    tls1_2 
9610: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
9620: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
9630: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
9640: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
9650: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b  .    tls1_3 = 0;
9660: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
9670: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63  (objc < 2) {..Tc
9680: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9690: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
96a0: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e  "channel ?option
96b0: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  s?");..return TC
96c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
96d0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
96e0: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e  ror();..    chan
96f0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
9700: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
9710: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9720: 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a  bjv[1], (Tcl_Siz
9730: 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  e *)NULL), NULL)
9740: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
9750: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
9760: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
9770: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9780: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9790: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
97a0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
97b0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
97c0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
97d0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
97e0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69   for (idx = 2; i
97f0: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b  dx < objc; idx++
9800: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d  ) {..char *opt =
9810: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9820: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c  omObj(objv[idx],
9830: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c   (Tcl_Size *)NUL
9840: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d  L);...if (opt[0]
9850: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72   != '-')..    br
9860: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d  eak;...OPTOBJ("-
9870: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f  alpn", alpn);..O
9880: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20  PTSTR("-cadir", 
9890: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28  CAdir);..OPTSTR(
98a0: 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c  "-cafile", CAfil
98b0: 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63  e);..OPTBYTE("-c
98c0: 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74  ert", cert, cert
98d0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  _len);..OPTSTR("
98e0: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74  -certfile", cert
98f0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
9900: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72  -cipher", cipher
9910: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  s);..OPTSTR("-ci
9920: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29  phers", ciphers)
9930: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9940: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65  ersuites", ciphe
9950: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42  rsuites);..OPTOB
9960: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63  J("-command", sc
9970: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22  ript);..OPTSTR("
9980: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61  -dhparams", DHpa
9990: 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28  rams);..OPTBYTE(
99a0: 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79  "-key", key, key
99b0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  _len);..OPTSTR("
99c0: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69  -keyfile", keyfi
99d0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d  le);..OPTSTR("-m
99e0: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09  odel", model);..
99f0: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72  OPTOBJ("-passwor
9a00: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09  d", password);..
9a10: 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68  OPTBOOL("-post_h
9a20: 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f  andshake", post_
9a30: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54  handshake);..OPT
9a40: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c  BOOL("-request",
9a50: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42   request);..OPTB
9a60: 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20  OOL("-require", 
9a70: 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e  require);..OPTIN
9a80: 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76  T("-security_lev
9a90: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50  el", level);..OP
9aa0: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c  TBOOL("-server",
9ab0: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54   server);..OPTST
9ac0: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c  R("-servername",
9ad0: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f   servername);..O
9ae0: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f  PTSTR("-session_
9af0: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29  id", session_id)
9b00: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
9b10: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42  2", ssl2);..OPTB
9b20: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c  OOL("-ssl3", ssl
9b30: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  3);..OPTBOOL("-t
9b40: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50  ls1", tls1);..OP
9b50: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c  TBOOL("-tls1.1",
9b60: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f   tls1_1);..OPTBO
9b70: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c  OL("-tls1.2", tl
9b80: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_2);..OPTBOOL(
9b90: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f  "-tls1.3", tls1_
9ba0: 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61  3);..OPTOBJ("-va
9bb0: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20  lidatecommand", 
9bc0: 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  vcmd);..OPTOBJ("
9bd0: 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a  -vcmd", vcmd);..
9be0: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22  .OPTBAD("option"
9bf0: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72  , "-alpn, -cadir
9c00: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74  , -cafile, -cert
9c10: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
9c20: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69  pher, -ciphersui
9c30: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  tes, -command, -
9c40: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
9c50: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
9c60: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f  , -password, -po
9c70: 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72  st_handshake, -r
9c80: 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65  equest, -require
9c90: 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65  , -security_leve
9ca0: 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72  l, -server, -ser
9cb0: 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f  vername, -sessio
9cc0: 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73  n_id, -ssl2, -ss
9cd0: 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31  l3, -tls1, -tls1
9ce0: 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c  .1, -tls1.2, -tl
9cf0: 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61  s1.3, or -valida
9d00: 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72  tecommand");...r
9d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9d20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72  .    }.    if (r
9d30: 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20  equest)..verify 
9d40: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c  |= SSL_VERIFY_CL
9d50: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f  IENT_ONCE | SSL_
9d60: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20  VERIFY_PEER;.   
9d70: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20   if (request && 
9d80: 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20  require).verify 
9d90: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41  |= SSL_VERIFY_FA
9da0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
9db0: 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  RT;.    if (requ
9dc0: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64  est && post_hand
9dd0: 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d  shake).verify |=
9de0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
9df0: 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20  _HANDSHAKE;.    
9e00: 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29  if (verify == 0)
9e10: 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56  ..verify = SSL_V
9e20: 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20  ERIFY_NONE;..   
9e30: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20   proto |= (ssl2 
9e40: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  ? TLS_PROTO_SSL2
9e50: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
9e60: 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f   |= (ssl3 ? TLS_
9e70: 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b  PROTO_SSL3 : 0);
9e80: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
9e90: 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  ls1 ? TLS_PROTO_
9ea0: 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  TLS1 : 0);.    p
9eb0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20  roto |= (tls1_1 
9ec0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
9ed0: 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _1 : 0);.    pro
9ee0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20  to |= (tls1_2 ? 
9ef0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
9f00: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
9f10: 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c   |= (tls1_3 ? TL
9f20: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a  S_PROTO_TLS1_3 :
9f30: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73   0);..    /* res
9f40: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c  et to NULL if bl
9f50: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69  ank string provi
9f60: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ded */.    if (c
9f70: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09  ert && !*cert)..
9f80: 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20          cert.   
9f90: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9fa0: 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65   if (key && !*ke
9fb0: 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09  y)..        key.
9fc0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9fd0: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
9fe0: 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20   && !*certfile) 
9ff0: 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65          certfile
a000: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20  .= NULL;.    if 
a010: 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65  (keyfile && !*ke
a020: 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09  yfile)..keyfile.
a030: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a040: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20      if (ciphers 
a050: 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20  && !*ciphers).  
a060: 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20        ciphers.  
a070: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a080: 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74    if (ciphersuit
a090: 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75  es && !*ciphersu
a0a0: 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74  ites) ciphersuit
a0b0: 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20  es    = NULL;.  
a0c0: 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20    if (CAfile && 
a0d0: 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20  !*CAfile).      
a0e0: 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20    CAfile.       
a0f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a100: 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69  (CAdir && !*CAdi
a110: 72 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72  r).        CAdir
a120: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a130: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
a140: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
a150: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
a160: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
a170: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
a180: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
a190: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
a1a0: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
a1b0: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
a1c0: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
a1d0: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
a1e0: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
a1f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
a200: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
a210: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
a220: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
a230: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
a240: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
a250: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
a260: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
a270: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
a280: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a    if (script) {.
a290: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a2a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72  tringFromObj(scr
a2b0: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ipt, &len);..if 
a2c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a2d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
a2e0: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54  = script;..    T
a2f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a300: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a310: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ck);..}.    }.. 
a320: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70     /* allocate p
a330: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69  assword */.    i
a340: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  f (password) {..
a350: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a360: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73  ringFromObj(pass
a370: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  word, &len);..if
a380: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
a390: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a3a0: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20   = password;..  
a3b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a3c0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
a3d0: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d  sword);..}.    }
a3e0: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a3f0: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61  e validate comma
a400: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63  nd */.    if (vc
a410: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  md) {..(void) Tc
a420: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a430: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a  bj(vcmd, &len);.
a440: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a450: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20   statePtr->vcmd 
a460: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c  = vcmd;..    Tcl
a470: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a480: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
a490: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
a4a0: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  (model != NULL) 
a4b0: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a  {..int mode;../*
a4c0: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22   Get the "model"
a4d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61   context */..cha
a4e0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
a4f0: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c  el(interp, model
a500: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63  , &mode);..if (c
a510: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
a520: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  nel) NULL) {..  
a530: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
a540: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a550: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a560: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  RROR;..}.../*.. 
a570: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
a580: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
a590: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20  pmost channel.. 
a5a0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
a5b0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
a5c0: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74  n);..if (Tcl_Get
a5d0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
a5e0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
a5f0: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54  Type()) {..    T
a600: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a610: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
a620: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
a630: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
a640: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
a650: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
a660: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
a670: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
a680: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
a690: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  RT", "CHANNEL", 
a6a0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
a6b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a6c0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
a6d0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a6e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a6f0: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28  OR;..}..ctx = ((
a700: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
a710: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
a720: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a  ta(chan))->ctx;.
a730: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
a740: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69   ((ctx = CTX_Ini
a750: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76  t(statePtr, serv
a760: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69  er, proto, keyfi
a770: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65  le, certfile, ke
a780: 79 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b  y, cert, (int) k
a790: 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e  ey_len,..    (in
a7a0: 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64  t) cert_len, CAd
a7b0: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
a7c0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
a7d0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
a7e0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
a7f0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a800: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a810: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a820: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
a830: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
a840: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
a850: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
a860: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
a870: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
a880: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
a890: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
a8a0: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
a8b0: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
a8c0: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
a8d0: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
a8e0: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
a8f0: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
a900: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
a910: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
a920: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
a930: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
a940: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
a950: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
a960: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
a970: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
a980: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a990: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
a9a0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
a9b0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
a9c0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
a9d0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
a9e0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a9f0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
aa00: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
aa10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
aa20: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
aa30: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
aa40: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
aa50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
aa60: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
aa70: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
aa80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
aa90: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
aaa0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
aab0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
aac0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
aad0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
aae0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
aaf0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
ab00: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
ab10: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
ab20: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
ab30: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
ab40: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ab50: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
ab60: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
ab70: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
ab80: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
ab90: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
aba0: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
abb0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
abc0: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
abd0: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
abe0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
abf0: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
ac00: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
ac10: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
ac20: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
ac30: 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61  ype(), (ClientDa
ac40: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54  ta) statePtr, (T
ac50: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
ac60: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
ac70: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
ac80: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
ac90: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
aca0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
acb0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
acc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
acd0: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
ace0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
acf0: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
ad00: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
ad10: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
ad20: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
ad30: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
ad40: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
ad50: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
ad60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ad70: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
ad80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ad90: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
ada0: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
adb0: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
adc0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
add0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
ade0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
adf0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ae00: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
ae10: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
ae20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
ae30: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
ae40: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
ae50: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
ae60: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
ae70: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
ae80: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
ae90: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
aea0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
aeb0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
aec0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aed0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
aee0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
aef0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
af00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
af10: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a  cking));..    /*
af20: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
af30: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
af40: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
af50: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
af60: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
af70: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
af80: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
af90: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
afa0: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
afb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
afc0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
afd0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
afe0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
aff0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b000: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b010: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b020: 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c  IMPORT", "INIT",
b030: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b040: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f   *) NULL);..Tls_
b050: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b060: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
b070: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b080: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f  }..    /* Set ho
b090: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a  st server name *
b0a0: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  /.    if (server
b0b0: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73  name) {../* Sets
b0c0: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65   the server name
b0d0: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49   indication (SNI
b0e0: 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  ) in ClientHello
b0f0: 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f   extension */../
b100: 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20  * Per RFC 6066, 
b110: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53  hostname is a AS
b120: 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69  CII encoded stri
b130: 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34  ng, though RFC 4
b140: 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20  366 says UTF-8. 
b150: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74  */..if (!SSL_set
b160: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d  _tlsext_host_nam
b170: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  e(statePtr->ssl,
b180: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20   servername) && 
b190: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20  require) {..    
b1a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b1b0: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e  (interp, "settin
b1c0: 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20  g TLS host name 
b1d0: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64  extension failed
b1e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
b1f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b200: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b210: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b220: 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44  , "SNI", "FAILED
b230: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
b240: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
b250: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
b260: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b270: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
b280: 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65  ./* Set hostname
b290: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66   for peer certif
b2a0: 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76  icate hostname v
b2b0: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63  erification in c
b2c0: 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27  lients...   Don'
b2d0: 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68  t use SSL_set1_h
b2e0: 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73  ost since it has
b2f0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f   limitations. */
b300: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f  ..if (!SSL_add1_
b310: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73  host(statePtr->s
b320: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29  sl, servername))
b330: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
b340: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b350: 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f   "setting DNS ho
b360: 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c  st name failed",
b370: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b380: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b390: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b3a0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b3b0: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49  "HOSTNAME", "FAI
b3c0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b3d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b3e0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b3f0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b410: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b420: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69  Resume session i
b430: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73  d */.    if (ses
b440: 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65  sion_id && strle
b450: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d  n(session_id) <=
b460: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58   SSL_MAX_SID_CTX
b470: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53  _LENGTH) {../* S
b480: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29  SL_set_session()
b490: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45   */..if (!SSL_SE
b4a0: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f  SSION_set1_id_co
b4b0: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65  ntext(SSL_get_se
b4c0: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  ssion(statePtr->
b4d0: 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ssl), session_id
b4e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
b4f0: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f   strlen(session_
b500: 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  id))) {..    Tcl
b510: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b520: 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65  terp, "Resume se
b530: 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73  ssion id ", sess
b540: 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64  ion_id, " failed
b550: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
b560: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b570: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b580: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b590: 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41  , "SESSION", "FA
b5a0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b5b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b5c0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b5d0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b5e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b5f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
b600: 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74   Enable Applicat
b610: 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63  ion-Layer Protoc
b620: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20  ol Negotiation. 
b630: 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74  Examples are: ht
b640: 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e  tp/1.0,..http/1.
b650: 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20  1, h2, h3, ftp, 
b660: 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70  imap, pop3, xmpp
b670: 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65  -client, xmpp-se
b680: 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c  rver, mqtt, irc,
b690: 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20   etc. */.    if 
b6a0: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e  (alpn) {../* Con
b6b0: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20  vert a TCL list 
b6c0: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d  into a protocol-
b6d0: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72  list in wire-for
b6e0: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64  mat */..unsigned
b6f0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a   char *protos, *
b700: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  p;..unsigned int
b710: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b   protos_len = 0;
b720: 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20  ..Tcl_Size cnt, 
b730: 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f  i;..int j;..Tcl_
b740: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66  Obj **list;...if
b750: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
b760: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
b770: 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69   alpn, &cnt, &li
b780: 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  st) != TCL_OK) {
b790: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
b7a0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
b7b0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b7c0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
b7d0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
b7e0: 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
b7f0: 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c  for the protocol
b800: 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69  -list */..for (i
b810: 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69   = 0; i < cnt; i
b820: 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47  ++) {..    Tcl_G
b830: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
b840: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a  list[i], &len);.
b850: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32  .    if (len > 2
b860: 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  55) {...Tcl_Appe
b870: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b880: 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20   "ALPN protocol 
b890: 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20  name too long", 
b8a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b8b0: 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
b8c0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b8d0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50  , "IMPORT", "ALP
b8e0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b8f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
b900: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b910: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72  ) statePtr);...r
b920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b930: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f  ..    }..    pro
b940: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28  tos_len += 1 + (
b950: 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  int) len;..}.../
b960: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
b970: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  lete protocol-li
b980: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20  st */..protos = 
b990: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c  ckalloc(protos_l
b9a0: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f  en);../* protoco
b9b0: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20  l-lists consist 
b9c0: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d  of 8-bit length-
b9d0: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73  prefixed, byte s
b9e0: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28  trings */..for (
b9f0: 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f  j = 0, p = proto
ba00: 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29  s; j < cnt; j++)
ba10: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74   {..    char *st
ba20: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
ba30: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d  gFromObj(list[j]
ba40: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70  , &len);..    *p
ba50: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ++ = (unsigned c
ba60: 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d  har) len;..    m
ba70: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73  emcpy(p, str, (s
ba80: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20  ize_t) len);..  
ba90: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a    p += len;..}..
baa0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  ./* SSL_set_alpn
bab0: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20  _protos makes a 
bac0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74  copy of the prot
bad0: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a  ocol-list */../*
bae0: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63   Note: This func
baf0: 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74  tions reverses t
bb00: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
bb10: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69  convention */..i
bb20: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  f (SSL_set_alpn_
bb30: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d  protos(statePtr-
bb40: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72  >ssl, protos, pr
bb50: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20  otos_len)) {..  
bb60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
bb70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c  lt(interp, "fail
bb80: 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70  ed to set ALPN p
bb90: 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72  rotocols", (char
bba0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
bbb0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
bbc0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
bbd0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
bbe0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
bbf0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
bc00: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
bc10: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
bc20: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73     ckfree(protos
bc30: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
bc40: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
bc50: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c  * Store protocol
bc60: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65  s list */..state
bc70: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72  Ptr->protos = pr
bc80: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d  otos;..statePtr-
bc90: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72  >protos_len = pr
bca0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
bcb0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
bcc0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
bcd0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bce0: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  os_len = 0;.    
bcf0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
bd00: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20   SSL Callbacks. 
bd10: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73      */.    SSL_s
bd20: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74  et_app_data(stat
bd30: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
bd40: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a   *)statePtr);./*
bd50: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75   point back to u
bd60: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  s */.    SSL_set
bd70: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72  _verify(statePtr
bd80: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56  ->ssl, verify, V
bd90: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a  erifyCallback);.
bda0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f      SSL_set_info
bdb0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
bdc0: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c  tr->ssl, InfoCal
bdd0: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
bde0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73  Callback for obs
bdf0: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  erving protocol 
be00: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e  messages */.#ifn
be10: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
be20: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20  SL_TRACE.    /* 
be30: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74  void SSL_CTX_set
be40: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
be50: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
be60: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
be70: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c  r);.    void SSL
be80: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c  _CTX_set_msg_cal
be90: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
bea0: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ctx, MessageCall
beb0: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53  back); */.    SS
bec0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
bed0: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
bee0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
bef0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c  atePtr);.    SSL
bf00: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
bf10: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  k(statePtr->ssl,
bf20: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
bf30: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
bf40: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61  * Create Tcl_Cha
bf50: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72  nnel BIO Handler
bf60: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
bf70: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  ->p_bio.= BIO_ne
bf80: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20  w_tcl(statePtr, 
bf90: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20  BIO_NOCLOSE);.  
bfa0: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09    statePtr->bio.
bfb0: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f  = BIO_new(BIO_f_
bfc0: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20  ssl());..    if 
bfd0: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53  (server) {../* S
bfe0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  erver callbacks 
bff0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
c000: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c010: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  e_arg(statePtr->
c020: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c030: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58  tePtr);..SSL_CTX
c040: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
c050: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28  ername_callback(
c060: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c070: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53  NICallback);..SS
c080: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
c090: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50  _hello_cb(stateP
c0a0: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61  tr->ctx, HelloCa
c0b0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c0c0: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28  statePtr);..if (
c0d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c0e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
c0f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70   SSL_CTX_set_alp
c100: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
c110: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c120: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c130: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64  )statePtr);.#ifd
c140: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20  ef USE_NPN..    
c150: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20  if (tls1_2 == 0 
c160: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
c170: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  {...SSL_CTX_set_
c180: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65  next_protos_adve
c190: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50  rtised_cb(stateP
c1a0: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c  tr->ctx, NPNCall
c1b0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c1c0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a  atePtr);..    }.
c1d0: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45  #endif..}.../* E
c1e0: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20  nable server to 
c1f0: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73  send cert reques
c200: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b  t after handshak
c210: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29  e (TLS 1.3 only)
c220: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20   */../* A write 
c230: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74  operation must t
c240: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68  ake place for th
c250: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65  e Certificate Re
c260: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20  quest to be..   
c270: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65  sent to the clie
c280: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20  nt, this can be 
c290: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f  done with SSL_do
c2a0: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f  _handshake(). */
c2b0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
c2c0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
c2d0: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20  && tls1_3) {..  
c2e0: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69    SSL_verify_cli
c2f0: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61  ent_post_handsha
c300: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ke(statePtr->ssl
c310: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61  );..}.../* set a
c320: 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73  utomatic curve s
c330: 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c  election */..SSL
c340: 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73  _set_ecdh_auto(s
c350: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
c360: 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65  ;.../* Set serve
c370: 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65  r mode */..state
c380: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
c390: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53  S_TCL_SERVER;..S
c3a0: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74  SL_set_accept_st
c3b0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
c3c0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
c3d0: 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c  ../* Client call
c3e0: 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20  backs */.#ifdef 
c3f0: 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61  USE_NPN..if (sta
c400: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
c410: 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20   NULL && tls1_2 
c420: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d  == 0 && tls1_3 =
c430: 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  = 0) {..    SSL_
c440: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f  CTX_set_next_pro
c450: 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61  to_select_cb(sta
c460: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e  tePtr->ctx, ALPN
c470: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
c480: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a  *)statePtr);..}.
c490: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73  #endif.../* Sess
c4a0: 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09  ion caching */..
c4b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73  SSL_CTX_set_sess
c4c0: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
c4d0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53  tatePtr->ctx, SS
c4e0: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49  L_SESS_CACHE_CLI
c4f0: 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43  ENT | SSL_SESS_C
c500: 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c  ACHE_NO_INTERNAL
c510: 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54  _STORE);..SSL_CT
c520: 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63  X_sess_set_new_c
c530: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c540: 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b   SessionCallback
c550: 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70  );.../* Enable p
c560: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75  ost handshake Au
c570: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74  thentication ext
c580: 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20  ension. TLS 1.3 
c590: 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32  only, not http/2
c5a0: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
c5b0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
c5c0: 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ake) {..    SSL_
c5d0: 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61  set_post_handsha
c5e0: 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72  ke_auth(statePtr
c5f0: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09  ->ssl, 1);..}...
c600: 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f  /* Set client mo
c610: 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63  de */..SSL_set_c
c620: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61  onnect_state(sta
c630: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
c640: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62   }.    SSL_set_b
c650: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  io(statePtr->ssl
c660: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
c670: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  o, statePtr->p_b
c680: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74  io);.    BIO_set
c690: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _ssl(statePtr->b
c6a0: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  io, statePtr->ss
c6b0: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  l, BIO_NOCLOSE);
c6c0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
c6d0: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a  End of SSL Init.
c6e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69       */.    dpri
c6f0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25  ntf("Returning %
c700: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
c710: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
c720: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c  >self));.    Tcl
c730: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
c740: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f  p, (char *) Tcl_
c750: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
c760: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
c770: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a  TCL_VOLATILE);..
c780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
c790: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
c7a0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
c7b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
c800: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
c810: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
c820: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
c830: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
c840: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
c850: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
c860: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
c870: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
c880: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
c890: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
c8a0: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
c8b0: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
c8c0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
c910: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
c920: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
c930: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
c940: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c950: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
c960: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
c970: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
c980: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
c990: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
c9a0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
c9b0: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
c9c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
c9d0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
c9e0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
c9f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ca00: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
ca10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ca20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
ca30: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
ca40: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
ca50: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
ca60: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
ca70: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
ca80: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
ca90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
caa0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
cab0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
cac0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
cad0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
cae0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
caf0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
cb00: 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c  n);..    if (Tcl
cb10: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
cb20: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
cb30: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
cb40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cb50: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
cb60: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
cb70: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
cb80: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
cb90: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
cba0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
cbb0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
cbc0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d  rp, "TLS", "UNIM
cbd0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
cbe0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
cbf0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
cc00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cc10: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
cc20: 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65  cl_UnstackChanne
cc30: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20  l(interp, chan) 
cc40: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a  == TCL_ERROR) {.
cc50: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
cc60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  R;.    }..    re
cc70: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
cc80: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
cc90: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e  ---. *. * CTX_In
ccf0: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20  it -- construct 
cd00: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  a SSL_CTX instan
cd10: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ce. *. * Results
cd20: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c  :. *.A valid SSL
cd30: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72  _CTX instance or
cd40: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64   NULL.. *. * Sid
cd50: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
cd60: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e  nstructs SSL con
cd70: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53  ---. */.static S
cdd0: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69  SL_CTX *.CTX_Ini
cde0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
cdf0: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
ce00: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
ce10: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20   *keyfile, char 
ce20: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75  *certfile,.    u
ce30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
ce40: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
ce50: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f   *cert, int key_
ce60: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65  len, int cert_le
ce70: 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a  n, char *CAdir,.
ce80: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
ce90: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  , char *ciphers,
cea0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
ceb0: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
cec0: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20  char *DHparams) 
ced0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
cee0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65   *interp = state
cef0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
cf00: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
cf10: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
cf20: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63  tring ds;.    Tc
cf30: 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20  l_DString ds1;. 
cf40: 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a     int off = 0;.
cf50: 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69      int load_pri
cf60: 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f  vate_key;.    co
cf70: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a  nst SSL_METHOD *
cf80: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72  method;..    dpr
cf90: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
cfa0: 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29  .    if (!proto)
cfb0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
cfc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
cfd0: 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20   valid protocol 
cfe0: 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72  selected", (char
cff0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
d000: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
d010: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
d020: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66  L context */.#if
d030: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
d040: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
d050: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
d060: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
d070: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d080: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45  _SSL2).    if (E
d090: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d0a0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
d0b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d0c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
d0d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d0e0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d0f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d100: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d110: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d120: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66  (NO_SSL3) || def
d130: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d140: 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL3).    if (EN
d150: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d160: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a  _PROTO_SSL3)) {.
d170: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d180: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20  t(interp, "SSL3 
d190: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d1a0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d1b0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d1c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d1d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d1e0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
d1f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d200: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  LS1).    if (ENA
d210: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d220: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09  PROTO_TLS1)) {..
d230: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d240: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
d250: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  0 protocol not s
d260: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
d270: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
d280: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d290: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d2a0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
d2b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d2c0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69  NO_TLS1_1).    i
d2d0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d2e0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
d2f0: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _1)) {..Tcl_Appe
d300: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d310: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63   "TLS 1.1 protoc
d320: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d330: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d340: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d350: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d360: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d370: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
d380: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d390: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
d3a0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d3b0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09  OTO_TLS1_2)) {..
d3c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d3d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
d3e0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
d3f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
d400: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
d410: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d420: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d430: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
d440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d450: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
d460: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d470: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
d480: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _3)) {..Tcl_Appe
d490: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d4a0: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63   "TLS 1.3 protoc
d4b0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d4c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d4d0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d4e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d4f0: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30    if (proto == 0
d500: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c  ) {../* Use full
d510: 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43   range */..SSL_C
d520: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
d530: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
d540: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
d550: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
d560: 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  (ctx, 0);.    }.
d570: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f  .    switch (pro
d580: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53  to) {.#if OPENSS
d590: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
d5a0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
d5b0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
d5c0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
d5d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
d5e0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d5f0: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f  OTO_SSL2:..metho
d600: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53  d = isServer ? S
d610: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68  SLv2_server_meth
d620: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69  od() : SSLv2_cli
d630: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
d640: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
d650: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
d660: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
d670: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
d680: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d690: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
d6a0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
d6b0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65  _PROTO_SSL3:..me
d6c0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
d6d0: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d  ? SSLv3_server_m
d6e0: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f  ethod() : SSLv3_
d6f0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
d700: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d710: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d720: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
d730: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d740: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
d750: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
d760: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
d770: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a  TLS_PROTO_TLS1:.
d780: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d790: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65  er ? TLSv1_serve
d7a0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
d7b0: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  v1_client_method
d7c0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d7d0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d7e0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
d7f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d800: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
d810: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d820: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
d830: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d840: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68  TO_TLS1_1:..meth
d850: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d860: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d  TLSv1_1_server_m
d870: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
d880: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
d890: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d8a0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d8b0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
d8c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d8d0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
d8e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d8f0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
d900: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d910: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f  O_TLS1_2:..metho
d920: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
d930: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65  LSv1_2_server_me
d940: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32  thod() : TLSv1_2
d950: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d960: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
d970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d980: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
d990: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d9a0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65  TLS1_3).    case
d9b0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d9c0: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67  3:../* Use the g
d9d0: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e  eneric method an
d9e0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e  d constraint ran
d9f0: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74  ge after context
da00: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09   is created */..
da10: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
da20: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
da30: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
da40: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
da50: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
da60: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e    default:../* N
da70: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74  egotiate highest
da80: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54   available SSL/T
da90: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d  LS version */..m
daa0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
dab0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
dac0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
dad0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69  ent_method();.#i
dae0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
daf0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
db00: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
db10: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
db20: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
db30: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d  NO_SSL2)..off |=
db40: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
db50: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
db60: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
db70: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69  NO_SSLv2);.#endi
db80: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
db90: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
dba0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
dbb0: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL3)..off |= (EN
dbc0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
dbd0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f  _PROTO_SSL3)   ?
dbe0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
dbf0: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv3);.#endif.#i
dc00: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
dc10: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
dc20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
dc30: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dc40: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dc50: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a  TO_TLS1)   ? 0 :
dc60: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
dc70: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dc80: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
dc90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dca0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
dcb0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dcc0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dcd0: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a  TO_TLS1_1) ? 0 :
dce0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
dcf0: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _1);.#endif.#if 
dd00: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
dd10: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
dd20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
dd30: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
dd40: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
dd50: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30  ROTO_TLS1_2) ? 0
dd60: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
dd70: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_2);.#endif.#i
dd80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
dd90: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
dda0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
ddb0: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_3)..off |= (EN
ddc0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
ddd0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f  _PROTO_TLS1_3) ?
dde0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
ddf0: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_3);.#endif.
de00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20  .break;.    }.. 
de10: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
de20: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d  or();..    ctx =
de30: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74   SSL_CTX_new(met
de40: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63  hod);.    if (!c
de50: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55  tx) {..return(NU
de60: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
de70: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
de80: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
de90: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
dea0: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
deb0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
dec0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
ded0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
dee0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
def0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
df00: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
df10: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
df20: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
df30: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
df40: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
df50: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
df60: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
df70: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
df80: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
df90: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
dfa0: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73  * Force cipher s
dfb0: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62  election order b
dfc0: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20  y server */.    
dfd0: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b  if (!isServer) {
dfe0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70  ..SSL_CTX_set_op
dff0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
e000: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f  P_CIPHER_SERVER_
e010: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20  PREFERENCE);.   
e020: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
e030: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
e040: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
e050: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c   OpenSSL_add_all
e060: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f  _algorithms(); /
e070: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61  * Load ciphers a
e080: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65  nd digests */.#e
e090: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54  ndif..    SSL_CT
e0a0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
e0b0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
e0c0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
e0d0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
e0e0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
e0f0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
e100: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
e110: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
e120: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
e130: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
e140: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e  ns(ctx, SSL_OP_N
e150: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09  O_COMPRESSION);.
e160: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72  /* disable compr
e170: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73  ession even if s
e180: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
e190: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
e1a0: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09  ons(ctx, off);..
e1b0: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f  /* disable proto
e1c0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a  col versions */.
e1d0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e1e0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
e1f0: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c  0101000L.    SSL
e200: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74  _CTX_set_mode(ct
e210: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
e220: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64  _RETRY);./* hand
e230: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65  le new handshake
e240: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e  s in background.
e250: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69   On by default i
e260: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e  n OpenSSL 1.1.1.
e270: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53   */.#endif.    S
e280: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
e290: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20  cache_size(ctx, 
e2a0: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  128);..    /* Se
e2b0: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  t user defined c
e2c0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73  iphers, cipher s
e2d0: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72  uites, and secur
e2e0: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
e2f0: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
e300: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
e310: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
e320: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
e330: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
e340: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
e350: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65  et ciphers faile
e360: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
e370: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
e380: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e390: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e3a0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
e3b0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69    if ((ciphersui
e3c0: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  tes != NULL) && 
e3d0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
e3e0: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63  hersuites(ctx, c
e3f0: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a  iphersuites)) {.
e400: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e410: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
e420: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69  ipher suites fai
e430: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
e440: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
e450: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
e460: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
e470: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
e480: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
e490: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
e4a0: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
e4b0: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
e4c0: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
e4d0: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
e4e0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
e4f0: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
e500: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
e510: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
e520: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
e530: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
e540: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
e550: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
e560: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
e570: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
e580: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
e590: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
e5a0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
e5b0: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
e5c0: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
e5d0: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
e5e0: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
e5f0: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  */.#ifdef OPENSS
e600: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
e610: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
e620: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
e630: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
e640: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
e650: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
e660: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
e670: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
e680: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
e690: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
e6a0: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
e6b0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
e6c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
e6d0: 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63  IO *bio;..    Tc
e6e0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
e6f0: 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  s);..    bio = B
e700: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
e710: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
e720: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
e730: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
e740: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
e750: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e760: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
e770: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
e780: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
e790: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e7a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e7b0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
e7c0: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
e7d0: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
e7e0: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
e7f0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
e800: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
e810: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
e820: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e830: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
e840: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
e850: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
e860: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
e870: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
e880: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
e890: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
e8a0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
e8b0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
e8c0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  }..} else {..   
e8d0: 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61   dh = get_dhPara
e8e0: 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54  ms();..}..SSL_CT
e8f0: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78  X_set_tmp_dh(ctx
e900: 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28  , dh);..DH_free(
e910: 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  dh);.    }.#endi
e920: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
e930: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
e940: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
e950: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
e960: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
e970: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
e980: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
e990: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
e9a0: 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  &ds);...if (SSL_
e9b0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
e9c0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  ate_file(ctx, F2
e9d0: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29  N(certfile, &ds)
e9e0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
e9f0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  EM) <= 0) {..   
ea00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
ea10: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
ea20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ea30: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
ea40: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  set certificate 
ea50: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
ea60: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
ea70: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
ea80: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
ea90: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
eaa0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
eab0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
eac0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
ead0: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
eae0: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
eaf0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
eb00: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
eb10: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
eb20: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
eb30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
eb40: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
eb50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
eb60: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
eb70: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
eb80: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
eb90: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
eba0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
ebb0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
ebc0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
ebd0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
ebe0: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61  .certfile = (cha
ebf0: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
ec00: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
ec10: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
ec20: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
ec30: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c  ile(ctx, certfil
ec40: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  e, SSL_FILETYPE_
ec50: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66  PEM) <= 0) {.#if
ec60: 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   0..    Tcl_DStr
ec70: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
ec80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ec90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
eca0: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75  ble to use defau
ecb0: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  lt certificate f
ecc0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
ecd0: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
ece0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
ecf0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
ed00: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ed10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
ed20: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  L;.#endif..}.   
ed30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
ed40: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
ed50: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
ed60: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
ed70: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
ed80: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
ed90: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
eda0: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
edb0: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
edc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
edd0: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
ede0: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
edf0: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
ee00: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
ee10: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
ee20: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
ee30: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
ee40: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
ee50: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
ee60: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
ee70: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
ee80: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
ee90: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
eea0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
eeb0: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
eec0: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
eed0: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
eee0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
eef0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
ef00: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
ef10: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
ef20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ef30: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
ef40: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
ef50: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
ef60: 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20  e, " ",....     
ef70: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
ef80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
ef90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
efa0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
efb0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
efc0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
efd0: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20  s);...} else if 
efe0: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (key != NULL) {.
eff0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
f000: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
f010: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53  ASN1(EVP_PKEY_RS
f020: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f  A, ctx, key,key_
f030: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  len) <= 0) {...T
f040: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f050: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
f060: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
f070: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
f080: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
f090: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
f0a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
f0b0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
f0c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f0d0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f0e0: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
f0f0: 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  key: ", REASON()
f100: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f110: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
f120: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
f130: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
f140: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
f150: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
f160: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
f170: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
f180: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
f190: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
f1a0: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
f1b0: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
f1c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f1d0: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
f1e0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
f1f0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
f200: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
f210: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
f220: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
f230: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f240: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
f250: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
f260: 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74  /* Set verificat
f270: 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54  ion CAs */.    T
f280: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
f290: 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ds);.    Tcl_DSt
f2a0: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
f2b0: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
f2c0: 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  one default dire
f2d0: 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75  ctory, one defau
f2e0: 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65  lt file, and one
f2f0: 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a   default store..
f300: 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20  .The default CA 
f310: 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72  certificates dir
f320: 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61  ectory (and defa
f330: 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e  ult store) is in
f340: 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65   the OpenSSL..ce
f350: 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49  rts directory. I
f360: 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  t can be overrid
f370: 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43  den by the SSL_C
f380: 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e  ERT_DIR env var.
f390: 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41   The..default CA
f3a0: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69   certificates fi
f3b0: 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72  le is called cer
f3c0: 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66  t.pem in the def
f3d0: 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69  ault OpenSSL..di
f3e0: 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20  rectory. It can 
f3f0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
f400: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
f410: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09  LE env var. */..
f420: 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73  /* int SSL_CTX_s
f430: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
f440: 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63  y_dir(SSL_CTX *c
f450: 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f  tx) and int SSL_
f460: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
f470: 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f  verify_file(SSL_
f480: 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20  CTX *ctx) */.   
f490: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
f4a0: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69  ad_verify_locati
f4b0: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ons(ctx, F2N(CAf
f4c0: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43  ile, &ds), F2N(C
f4d0: 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a  Adir, &ds1)) ||.
f4e0: 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  .!SSL_CTX_set_de
f4f0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74  fault_verify_pat
f500: 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30  hs(ctx)) {.#if 0
f510: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f520: 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74  e(&ds);..Tcl_DSt
f530: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
f540: 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e  ./* Don't curren
f550: 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73  tly care if this
f560: 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41   fails */..Tcl_A
f570: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f580: 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74  rp, "SSL default
f590: 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22   verify paths: "
f5a0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  , REASON(), (cha
f5b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
f5c0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f5d0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65  .return NULL;.#e
f5e0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
f5f0: 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63  /* https://sourc
f600: 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73  eforge.net/p/tls
f610: 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20  /bugs/57/ */.   
f620: 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65   /* XXX:TODO: Le
f630: 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c  t the user suppl
f640: 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e  y values here in
f650: 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69  stead of somethi
f660: 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f  ng that exists o
f670: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
f680: 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69   */.    if (CAfi
f690: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53  le != NULL) {..S
f6a0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
f6b0: 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20  E) *certNames = 
f6c0: 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f  SSL_load_client_
f6d0: 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69  CA_file(F2N(CAfi
f6e0: 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28  le, &ds));..if (
f6f0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c  certNames != NUL
f700: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
f710: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
f720: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
f730: 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  mes);..}.    }..
f740: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f750: 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63  ree(&ds);.    Tc
f760: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f770: 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  s1);.    return 
f780: 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ctx;.}.../*. *--
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7d0: 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62  -. *. * StatusOb
f7e0: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
f7f0: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63  ertificate for c
f800: 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20  onnected peer.. 
f810: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
f820: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
f830: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
f840: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
f850: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
f860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
f8a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61  /.static int.Sta
f8b0: 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  tusObjCmd(Client
f8c0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
f8d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f8e0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
f8f0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
f900: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74  jv[]) {.    Stat
f910: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20  e *statePtr;.   
f920: 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20   X509 *peer;.   
f930: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
f940: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
f950: 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72  l chan;.    char
f960: 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a   *channelName, *
f970: 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74  ciphers;.    int
f980: 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   mode;.    const
f990: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f9a0: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67  proto;.    unsig
f9b0: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20  ned int len;.   
f9c0: 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a   int nid, res;..
f9d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
f9e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
f9f0: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63  objc < 2 || objc
fa00: 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d   > 3 || (objc ==
fa10: 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63   3 && !strcmp(Tc
fa20: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fa30: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29  [1]), "-local"))
fa40: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
fa50: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
fa60: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f   objv, "?-local?
fa70: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74   channel");..ret
fa80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fa90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
faa0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20   channel Id */. 
fab0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d     channelName =
fac0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fad0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63  omObj(objv[(objc
fae0: 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c   == 2 ? 1 : 2)],
faf0: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55   (Tcl_Size *) NU
fb00: 4c 4c 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20  LL);.    chan = 
fb10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
fb20: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61  nterp, channelNa
fb30: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20  me, &mode);.    
fb40: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
fb50: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
fb60: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
fb70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
fb80: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
fb90: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
fba0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
fbb0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
fbc0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
fbd0: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
fbe0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
fbf0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
fc00: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
fc10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fc20: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
fc30: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
fc40: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
fc50: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
fc60: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
fc70: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
fc80: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
fc90: 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22   "TLS", "STATUS"
fca0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
fcb0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
fcc0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
fcd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fce0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
fcf0: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65  (State *) Tcl_Ge
fd00: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
fd10: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
fd20: 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63   /* Get certific
fd30: 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20  ate for peer or 
fd40: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28  self */.    if (
fd50: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65  objc == 2) {..pe
fd60: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  er = SSL_get_pee
fd70: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  r_certificate(st
fd80: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
fd90: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72    } else {..peer
fda0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69   = SSL_get_certi
fdb0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
fdc0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
fdd0: 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72   /* Get X509 cer
fde0: 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f  tificate info */
fdf0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b  .    if (peer) {
fe00: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e  ..objPtr = Tls_N
fe10: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70  ewX509Obj(interp
fe20: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62  , peer);..if (ob
fe30: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20  jc == 2) {..    
fe40: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b  X509_free(peer);
fe50: 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c  ..    peer = NUL
fe60: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
fe70: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c   {..objPtr = Tcl
fe80: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
fe90: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
fea0: 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f   /* Peer name */
feb0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
fec0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fed0: 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c   "peername", SSL
fee0: 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73  _get0_peername(s
fef0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
ff00: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  1);.    LAPPEND_
ff10: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
ff20: 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c  tr, "sbits", SSL
ff30: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73  _get_cipher_bits
ff40: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
ff50: 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70  NULL));..    cip
ff60: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53  hers = (char*)SS
ff70: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61  L_get_cipher(sta
ff80: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
ff90: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
ffa0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
ffb0: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20  pher", ciphers, 
ffc0: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  -1);..    /* Ver
ffd0: 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72  ify the X509 cer
ffe0: 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74  tificate present
fff0: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a  ed by the peer *
10000 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  /.    LAPPEND_ST
10010 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10020 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22  , "verifyResult"
10030 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63  ,..X509_verify_c
10040 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
10050 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
10060 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
10070 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20  >ssl)), -1);..  
10080 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65    /* Verify mode
10090 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53   */.    mode = S
100a0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f  SL_get_verify_mo
100b0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  de(statePtr->ssl
100c0 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20  );.    if (mode 
100d0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f  && SSL_VERIFY_NO
100e0 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53  NE) {..LAPPEND_S
100f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10100 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c  r, "verifyMode",
10110 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20   "none", -1);.  
10120 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
10130 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20  Obj *listObjPtr 
10140 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
10150 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  (0, NULL);..if (
10160 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
10170 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20  FY_PEER) {..    
10180 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10190 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
101a0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
101b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
101c0 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  eer", -1));..}..
101d0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
101e0 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
101f0 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
10200 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10210 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10220 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10230 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10240 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65  j("fail if no pe
10250 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a  er cert", -1));.
10260 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
10270 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
10280 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54  T_ONCE) {..    T
10290 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
102a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
102b0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
102c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c  NewStringObj("cl
102d0 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29  ient once", -1))
102e0 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
102f0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  & SSL_VERIFY_POS
10300 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09  T_HANDSHAKE) {..
10310 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10320 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10330 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10340 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10350 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  j("post handshak
10360 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41  e", -1));..}..LA
10370 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
10380 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
10390 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50  yMode", listObjP
103a0 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  tr).    }..    /
103b0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65  * Verify mode de
103c0 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  pth */.    LAPPE
103d0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
103e0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65  bjPtr, "verifyDe
103f0 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65  pth", SSL_get_ve
10400 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65  rify_depth(state
10410 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20  Ptr->ssl));..   
10420 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73   /* Report the s
10430 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
10440 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
10450 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  the negotiation 
10460 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f  */.    SSL_get0_
10470 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74  alpn_selected(st
10480 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72  atePtr->ssl, &pr
10490 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  oto, &len);.    
104a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
104b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70  rp, objPtr, "alp
104c0 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74  n", (char *)prot
104d0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  o, (Tcl_Size) le
104e0 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  n);.    LAPPEND_
104f0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10500 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
10510 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
10520 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
10530 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  -1);..    /* Val
10540 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73  id for non-RSA s
10550 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53  ignature and TLS
10560 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28   1.3 */.    if (
10570 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65  objc == 2) {..re
10580 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  s = SSL_get_peer
10590 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
105a0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
105b0 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  id);.    } else 
105c0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
105d0 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
105e0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
105f0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
10600 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
10610 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
10620 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10630 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61  tr, "signatureHa
10640 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  shAlgorithm", OB
10650 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
10660 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  1);..    if (obj
10670 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
10680 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
10690 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
106a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
106b0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
106c0 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
106d0 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  et_signature_typ
106e0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
106f0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
10700 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
10710 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c  {nid = 0;}.    L
10720 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10730 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e  p, objPtr, "sign
10740 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f  atureType", OBJ_
10750 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
10760 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
10770 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10780 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
10790 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
107a0 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
107b0 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
107c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10800 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74  --. *. * Connect
10810 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d  ionInfoObjCmd --
10820 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69   return connecti
10830 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65  on info from Ope
10840 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
10850 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f  lts:. *.A list o
10860 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  f connection inf
10870 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  o.  *. *--------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
108c0 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e  .static int Conn
108d0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
108e0 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
108f0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
10900 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
10910 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
10920 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
10930 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
10940 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
10950 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
10960 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61  de on */.    Sta
10970 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
10980 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
10990 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
109a0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
109b0 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  jPtr, *listPtr;.
109c0 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73      const SSL *s
109d0 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  sl;.    const SS
109e0 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  L_CIPHER *cipher
109f0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
10a00 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
10a10 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
10a20 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20  MD *md;..    if 
10a30 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
10a40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10a50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10a60 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
10a70 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10a80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
10a90 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
10aa0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
10ab0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10ac0 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a  bjv[1], (Tcl_Siz
10ad0 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  e *)NULL), NULL)
10ae0 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
10af0 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
10b00 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28  NULL) {..return(
10b10 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
10b20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
10b30 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
10b40 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
10b50 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
10b60 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
10b70 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
10b80 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
10b90 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
10ba0 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
10bb0 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
10bc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10bd0 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
10be0 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
10bf0 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
10c00 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
10c10 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
10c20 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
10c30 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
10c40 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20  , "CONNECTION", 
10c50 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
10c60 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
10c70 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  ULL);..return(TC
10c80 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
10c90 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
10ca0 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
10cb0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  NULL);..    /* C
10cc0 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a  onnection info *
10cd0 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  /.    statePtr =
10ce0 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
10cf0 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
10d00 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20  Data(chan);.    
10d10 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  ssl = statePtr->
10d20 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c  ssl;.    if (ssl
10d30 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20   != NULL) {../* 
10d40 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65  connection state
10d50 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
10d60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10d70 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74   "state", SSL_st
10d80 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
10d90 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
10da0 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65  Get SNI requeste
10db0 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  d server name */
10dc0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10dd0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10de0 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  ervername", SSL_
10df0 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
10e00 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
10e10 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20  YPE_host_name), 
10e20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72  -1);.../* Get pr
10e30 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45  otocol */..LAPPE
10e40 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10e50 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
10e60 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  ", SSL_get_versi
10e70 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09  on(ssl), -1);...
10e80 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e  /* Renegotiation
10e90 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50   allowed */..LAP
10ea0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
10eb0 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67  , objPtr, "reneg
10ec0 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64  otiation_allowed
10ed0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72  ", SSL_get_secur
10ee0 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f  e_renegotiation_
10ef0 73 75 70 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a  support(ssl));..
10f00 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79  ./* Get security
10f10 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45   level */..LAPPE
10f20 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
10f30 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79  bjPtr, "security
10f40 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74  _level", SSL_get
10f50 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
10f60 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ssl));.../* Sess
10f70 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ion info */..LAP
10f80 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
10f90 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
10fa0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f  on_reused", SSL_
10fb0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73  session_reused(s
10fc0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65  sl));.../* Is se
10fd0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  rver info */..LA
10fe0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
10ff0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73  p, objPtr, "is_s
11000 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73  erver", SSL_is_s
11010 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f  erver(ssl));.../
11020 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41  * Is DTLS */..LA
11030 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11040 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64  p, objPtr, "is_d
11050 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c  tls", SSL_is_dtl
11060 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a  s(ssl));.    }..
11070 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e      /* Cipher in
11080 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72  fo */.    cipher
11090 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
110a0 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a  nt_cipher(ssl);.
110b0 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21      if (cipher !
110c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
110d0 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30  buf[BUFSIZ] = {0
110e0 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c  };..int bits, al
110f0 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70  g_bits;.../* Cip
11100 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  her name */..LAP
11110 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11120 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
11130 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ", SSL_CIPHER_ge
11140 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  t_name(cipher), 
11150 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61  -1);.../* RFC na
11160 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
11170 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11180 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
11190 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53  andard_name", SS
111a0 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
111b0 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  d_name(cipher), 
111c0 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53  -1);.../* OpenSS
111d0 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72  L name of cipher
111e0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
111f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11200 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c   "openssl_name",
11210 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f   OPENSSL_cipher_
11220 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f  name(SSL_CIPHER_
11230 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
11240 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
11250 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72  * number of secr
11260 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72  et bits used for
11270 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73   cipher */..bits
11280 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
11290 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26  t_bits(cipher, &
112a0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50  alg_bits);..LAPP
112b0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
112c0 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f  objPtr, "secret_
112d0 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c  bits", bits);..L
112e0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
112f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f  p, objPtr, "algo
11300 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67  rithm_bits", alg
11310 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f  _bits);../* alg_
11320 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b  bits is actual k
11330 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20  ey secret bits. 
11340 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20  If use bits and 
11350 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68  secret (algorith
11360 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a  m) bits differ,.
11370 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20  .   the rest of 
11380 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78  the bits are fix
11390 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d  ed, i.e. for lim
113a0 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68  ited export ciph
113b0 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20  ers (bits < 56) 
113c0 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65  */.../* Indicate
113d0 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20  s which SSL/TLS 
113e0 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
113f0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74   first defined t
11400 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  he cipher */..LA
11410 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11420 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76  , objPtr, "min_v
11430 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50  ersion", SSL_CIP
11440 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  HER_get_version(
11450 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
11460 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f  /* Cipher NID */
11470 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11480 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11490 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72  ipherNID", (char
114a0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
114b0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70  L_CIPHER_get_cip
114c0 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29  her_nid(cipher))
114d0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
114e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
114f0 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c  tr, "digestNID",
11500 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
11510 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
11520 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69  et_digest_nid(ci
11530 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
11540 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11550 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78  , objPtr, "keyEx
11560 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61  changeNID", (cha
11570 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
11580 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78  SL_CIPHER_get_kx
11590 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
115a0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
115b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
115c0 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   "authentication
115d0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
115e0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
115f0 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64  HER_get_auth_nid
11600 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
11610 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74  ../* message aut
11620 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65  hentication code
11630 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41   - Cipher is AEA
11640 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43  D (e.g. GCM or C
11650 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35  haCha20/Poly1305
11660 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20  ) or not */../* 
11670 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e  Authenticated En
11680 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73  cryption with as
11690 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41  sociated data (A
116a0 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c  EAD) check */..L
116b0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
116c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
116d0 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53  her_is_aead", SS
116e0 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64  L_CIPHER_is_aead
116f0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
11700 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69  Digest used duri
11710 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68  ng the SSL/TLS h
11720 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73  andshake when us
11730 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20  ing the cipher. 
11740 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50  */..md = SSL_CIP
11750 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b  HER_get_handshak
11760 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29  e_digest(cipher)
11770 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11780 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11790 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74  handshake_digest
117a0 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d  ", (char *)EVP_M
117b0 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b  D_name(md), -1);
117c0 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53  .../* Get OpenSS
117d0 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e  L-specific ID, n
117e0 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c  ot IANA ID */..L
117f0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
11800 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11810 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  er_id", (int) SS
11820 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28  L_CIPHER_get_id(
11830 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54  cipher));.../* T
11840 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20  wo-byte ID used 
11850 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f  in the TLS proto
11860 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e  col of the given
11870 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
11880 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11890 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f  objPtr, "protoco
118a0 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  l_id", (int) SSL
118b0 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74  _CIPHER_get_prot
118c0 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29  ocol_id(cipher))
118d0 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64  ;.../* Textual d
118e0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
118f0 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20  e cipher */..if 
11900 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
11910 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20  ription(cipher, 
11920 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
11930 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) != NULL) {..  
11940 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
11950 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
11960 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66  escription", buf
11970 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  , -1);..}.    }.
11980 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
11990 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73  info */.    sess
119a0 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ion = SSL_get_se
119b0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20  ssion(ssl);.    
119c0 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e  if (session != N
119d0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
119e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
119f0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  ket;..size_t len
11a00 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  2;..unsigned int
11a10 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e   ulen;..const un
11a20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
11a30 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b  sion_id, *proto;
11a40 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 53  ..char buffer[SS
11a50 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
11a60 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52  _LENGTH];.../* R
11a70 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
11a80 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
11a90 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41   result of the A
11aa0 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  LPN negotiation 
11ab0 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
11ac0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
11ad0 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f  ed(session, &pro
11ae0 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  to, &len2);..LAP
11af0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11b00 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
11b10 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c   (char *) proto,
11b20 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
11b30 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  );.../* Report t
11b40 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
11b50 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
11b60 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f   of the NPN nego
11b70 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65  tiation */.#ifde
11b80 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67  f USE_NPN..SSL_g
11b90 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e  et0_next_proto_n
11ba0 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26  egotiated(ssl, &
11bb0 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09  proto, &ulen);..
11bc0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11bd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e  rp, objPtr, "npn
11be0 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74  ", (char *) prot
11bf0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  o, (Tcl_Size) ul
11c00 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  en);.#endif.../*
11c10 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69   Resumable sessi
11c20 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  on */..LAPPEND_B
11c30 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
11c40 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c  tr, "resumable",
11c50 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f   SSL_SESSION_is_
11c60 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f  resumable(sessio
11c70 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
11c80 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65  n start time (se
11c90 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63  conds since epoc
11ca0 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c  h) */..LAPPEND_L
11cb0 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ONG(interp, objP
11cc0 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22  tr, "start_time"
11cd0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
11ce0 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29  t_time(session))
11cf0 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76  ;.../* Timeout v
11d00 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67  alue - SSL_CTX_g
11d10 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73  et_timeout (in s
11d20 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50  econds) */..LAPP
11d30 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
11d40 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75   objPtr, "timeou
11d50 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  t", SSL_SESSION_
11d60 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73  get_timeout(sess
11d70 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ion));.../* Sess
11d80 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32  ion id - TLSv1.2
11d90 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20   and below only 
11da0 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
11db0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
11dc0 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  _id(session, &ul
11dd0 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  en);..LAPPEND_BA
11de0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
11df0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64  Ptr, "session_id
11e00 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
11e10 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
11e20 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f  .../* Session co
11e30 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f  ntext */..sessio
11e40 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
11e50 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65  ON_get0_id_conte
11e60 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  xt(session, &ule
11e70 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
11e80 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
11e90 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e  tr, "session_con
11ea0 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69  text", session_i
11eb0 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  d, (Tcl_Size) ul
11ec0 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  en);.../* Sessio
11ed0 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e  n ticket - clien
11ee0 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53  t only */..SSL_S
11ef0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
11f00 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
11f10 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
11f20 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
11f30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11f40 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74  ssion_ticket", t
11f50 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
11f60 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65  ) len2);.../* Se
11f70 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66  ssion ticket lif
11f80 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73  etime hint (in s
11f90 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50  econds) */..LAPP
11fa0 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
11fb0 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69   objPtr, "lifeti
11fc0 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  me", SSL_SESSION
11fd0 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
11fe0 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
11ff0 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74  n));.../* Ticket
12000 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53   app data */..SS
12010 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74  L_SESSION_get0_t
12020 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65  icket_appdata(se
12030 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
12040 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
12050 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
12060 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f  objPtr, "ticket_
12070 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65  app_data", ticke
12080 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
12090 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61  n2);.../* Get ma
120a0 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e  ster key */..len
120b0 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  2 = SSL_SESSION_
120c0 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73  get_master_key(s
120d0 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20  ession, buffer, 
120e0 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b  SSL_MAX_MASTER_K
120f0 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50  EY_LENGTH);..LAP
12100 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12110 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73  rp, objPtr, "mas
12120 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72  ter_key", buffer
12130 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
12140 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73  2);.../* Compres
12150 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69  sion id */..unsi
12160 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53  gned int id = SS
12170 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f  L_SESSION_get_co
12180 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f  mpress_id(sessio
12190 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
121a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
121b0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64   "compression_id
121c0 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c  ", id == 1 ? "zl
121d0 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  ib" : "none", -1
121e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
121f0 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66   Compression inf
12200 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c  o */.    if (ssl
12210 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64   != NULL) {.#ifd
12220 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50  ef HAVE_SSL_COMP
12230 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43  RESSION..const C
12240 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70  OMP_METHOD *comp
12250 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d  , *expn;..comp =
12260 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
12270 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c  _compression(ssl
12280 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67  );..expn = SSL_g
12290 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e  et_current_expan
122a0 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50  sion(ssl);...LAP
122b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
122c0 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
122d0 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53  ssion", comp ? S
122e0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
122f0 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c  (comp) : "none",
12300 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
12310 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12320 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
12330 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  expn ? SSL_COMP_
12340 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a  get_name(expn) :
12350 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
12360 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  lse..LAPPEND_STR
12370 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12380 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
12390 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41  "none", -1);..LA
123a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
123b0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e  , objPtr, "expan
123c0 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  sion", "none", -
123d0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
123e0 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20  ..    /* Server 
123f0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c  info */.    {..l
12400 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43  ong mode = SSL_C
12410 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_get_session_c
12420 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
12430 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20  tr->ctx);..char 
12440 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65  *msg;...if (mode
12450 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12460 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73  E_OFF) {..    ms
12470 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c  g = "off";..} el
12480 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12490 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49  L_SESS_CACHE_CLI
124a0 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  ENT) {..    msg 
124b0 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65  = "client";..} e
124c0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
124d0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45  SL_SESS_CACHE_SE
124e0 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67  RVER) {..    msg
124f0 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20   = "server";..} 
12500 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
12510 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42  SSL_SESS_CACHE_B
12520 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  OTH) {..    msg 
12530 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73  = "both";..} els
12540 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  e {..    msg = "
12550 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41  unknown";..}..LA
12560 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12570 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
12580 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20  on_cache_mode", 
12590 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  msg, -1);.    }.
125a0 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20  .    /* CA List 
125b0 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74  */.    /* IF not
125c0 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20   a server, same 
125d0 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72  as SSL_get0_peer
125e0 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72  _CA_list. If ser
125f0 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  ver same as SSL_
12600 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_get_client_C
12610 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69  A_list */.    li
12620 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
12630 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
12640 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
12650 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73  09_NAME) *ca_lis
12660 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c  t;.    if ((ca_l
12670 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c  ist = SSL_get_cl
12680 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c  ient_CA_list(ssl
12690 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  )) != NULL) {..c
126a0 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49  har buffer[BUFSI
126b0 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  Z];..for (int i 
126c0 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39  = 0; i < sk_X509
126d0 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73  _NAME_num(ca_lis
126e0 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  t); i++) {..    
126f0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  X509_NAME *name 
12700 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76  = sk_X509_NAME_v
12710 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29  alue(ca_list, i)
12720 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29  ;..    if (name)
12730 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f   {...X509_NAME_o
12740 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66  neline(name, buf
12750 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09  fer, BUFSIZ);...
12760 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12770 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12780 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
12790 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
127a0 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  r, -1));..    }.
127b0 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  .}.    }.    LAP
127c0 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
127d0 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
127e0 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  ", listPtr);.   
127f0 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
12800 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
12810 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58  ListCount", sk_X
12820 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
12830 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c  list));..    Tcl
12840 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12850 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
12860 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
12870 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
12880 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
12890 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56  --------. *. * V
128e0 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20  ersionObjCmd -- 
128f0 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73  return version s
12900 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53  tring from OpenS
12910 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
12920 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
12930 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
12940 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12950 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
12960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129a0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
129b0 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28  t.VersionObjCmd(
129c0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
129d0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
129e0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
129f0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
12a00 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
12a10 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
12a20 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
12a30 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
12a40 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
12a50 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53  StringObj(OPENSS
12a60 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20  L_VERSION_TEXT, 
12a70 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  -1);.    Tcl_Set
12a80 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12a90 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20  , objPtr);..    
12aa0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
12ab0 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
12ac0 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d  entData;..objc =
12ad0 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f   objc;..objv = o
12ae0 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  bjv;.}.../*. *--
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b30 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43  -. *. * MiscObjC
12b40 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61  md -- misc comma
12b50 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nds. *. * Result
12b60 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
12b70 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
12b80 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12b90 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12be0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
12bf0 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69  t.MiscObjCmd(Cli
12c00 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
12c10 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
12c20 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
12c30 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
12c40 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73   objv[]) {.    s
12c50 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
12c60 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20   *commands [] = 
12c70 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71  { "req", "strreq
12c80 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65  ", NULL };.    e
12c90 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f  num command { C_
12ca0 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43  REQ, C_STRREQ, C
12cb0 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63  _DUMMY };.    Tc
12cc0 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20  l_Size cmd;.    
12cd0 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63  int isStr;.    c
12ce0 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34  har buffer[16384
12cf0 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ];..    dprintf(
12d00 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
12d10 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
12d20 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
12d30 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
12d40 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f  v, "subcommand ?
12d50 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  args?");..return
12d60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12d70 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
12d80 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
12d90 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63  terp, objv[1], c
12da0 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e  ommands, "comman
12db0 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20  d", 0, &cmd) != 
12dc0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
12dd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12de0 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
12df0 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
12e00 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20  isStr = (cmd == 
12e10 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73  C_STRREQ);.    s
12e20 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d  witch ((enum com
12e30 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61  mand) cmd) {..ca
12e40 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20  se C_REQ:..case 
12e50 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20  C_STRREQ: {..   
12e60 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d   EVP_PKEY *pkey=
12e70 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20  NULL;..    X509 
12e80 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *cert=NULL;..   
12e90 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65   X509_NAME *name
12ea0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f  =NULL;..    Tcl_
12eb0 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20  Obj **listv;..  
12ec0 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63    Tcl_Size listc
12ed0 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09  ;..    int i;...
12ee0 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c      BIO *out=NUL
12ef0 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  L;...    char *k
12f00 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a  _C="",*k_ST="",*
12f10 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a  k_L="",*k_O="",*
12f20 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22  k_OU="",*k_CN=""
12f30 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20  ,*k_Email="";.. 
12f40 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c     char *keyout,
12f50 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20  *pemout,*str;.. 
12f60 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73     int keysize,s
12f70 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35  erial=0,days=365
12f80 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
12f90 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
12fa0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
12fb0 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e   BIGNUM *bne = N
12fc0 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72  ULL;..    RSA *r
12fd0 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65  sa = NULL;.#else
12fe0 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43  ..    EVP_PKEY_C
12ff0 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
13000 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20  #endif...    if 
13010 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62  ((objc<5) || (ob
13020 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57  jc>6)) {...Tcl_W
13030 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13040 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65  rp, 2, objv, "ke
13050 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65  ysize keyfile ce
13060 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b  rtfile ?info?");
13070 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13080 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ROR;..    }...  
13090 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74    if (Tcl_GetInt
130a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
130b0 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a  objv[2], &keysiz
130c0 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  e) != TCL_OK) {.
130d0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
130e0 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
130f0 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  keyout=Tcl_GetSt
13100 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09  ring(objv[3]);..
13110 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47      pemout=Tcl_G
13120 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
13130 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74  );..    if (isSt
13140 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61  r) {...Tcl_SetVa
13150 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
13160 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74  "",0);...Tcl_Set
13170 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
13180 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a  t,"",0);..    }.
13190 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d  ..    if (objc>=
131a0 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c  6) {...if (Tcl_L
131b0 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
131c0 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35  s(interp, objv[5
131d0 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ], &listc, &list
131e0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
131f0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13200 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
13210 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
13220 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
13230 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13240 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
13250 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
13260 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
13270 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
13280 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13290 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
132a0 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
132b0 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
132c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
132d0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
132e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
132f0 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
13300 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
13310 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
13320 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
13330 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
13340 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13350 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13360 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
13370 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
13380 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
13390 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
133a0 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
133b0 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
133c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
133d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
133e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
133f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d  ")==0) {....k_C=
13400 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13410 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13420 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13430 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29  mp(str,"ST")==0)
13440 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47   {....k_ST=Tcl_G
13450 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13460 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13470 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13480 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"L")==0) {....
13490 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_L=Tcl_GetStrin
134a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
134b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
134c0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d  strcmp(str,"O")=
134d0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c  =0) {....k_O=Tcl
134e0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
134f0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13500 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13510 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a  str,"OU")==0) {.
13520 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53  ...k_OU=Tcl_GetS
13530 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13540 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13550 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13560 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  CN")==0) {....k_
13570 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  CN=Tcl_GetString
13580 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13590 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
135a0 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c  trcmp(str,"Email
135b0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d  ")==0) {....k_Em
135c0 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  ail=Tcl_GetStrin
135d0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
135e0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
135f0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
13600 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70  nterp,"Unknown p
13610 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b  arameter",NULL);
13620 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ....return TCL_E
13630 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09  RROR;...    }...
13640 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  }..    }..#if OP
13650 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13660 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13670 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e  0L..    bne = BN
13680 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61  _new();..    rsa
13690 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20   = RSA_new();.. 
136a0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b     pkey = EVP_PK
136b0 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69  EY_new();..    i
136c0 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c  f (bne == NULL |
136d0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | rsa == NULL ||
136e0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   pkey == NULL ||
136f0 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e   !BN_set_word(bn
13700 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21  e,RSA_F4) ||...!
13710 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79  RSA_generate_key
13720 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65  _ex(rsa, keysize
13730 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20  , bne, NULL) || 
13740 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e  !EVP_PKEY_assign
13750 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29  _RSA(pkey, rsa))
13760 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
13770 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52  ee(pkey);.../* R
13780 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72  SA_free(rsa); fr
13790 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f  eed by EVP_PKEY_
137a0 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65  free */...BN_fre
137b0 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20  e(bne);.#else.. 
137c0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53     pkey = EVP_RS
137d0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  A_gen((unsigned 
137e0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09  int) keysize);..
137f0 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b      ctx = EVP_PK
13800 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c  EY_CTX_new(pkey,
13810 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28  NULL);..    if (
13820 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13830 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  ctx == NULL || !
13840 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f  EVP_PKEY_keygen_
13850 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21  init(ctx) ||...!
13860 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74  EVP_PKEY_CTX_set
13870 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73  _rsa_keygen_bits
13880 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c  (ctx, keysize) |
13890 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
138a0 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20  en(ctx, &pkey)) 
138b0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
138c0 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50  e(pkey);...EVP_P
138d0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78  KEY_CTX_free(ctx
138e0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f  );.#endif...Tcl_
138f0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13900 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
13910 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c  ng private key",
13920 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
13930 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
13940 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69  } else {...if (i
13950 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
13960 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
13970 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
13980 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
13990 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
139a0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
139b0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d  ,NULL);...    i=
139c0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
139d0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
139e0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
139f0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
13a00 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
13a10 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
13a20 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
13a30 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
13a40 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
13a50 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
13a60 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
13a70 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
13a80 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
13a90 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
13aa0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
13ab0 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20  t,keyout);...   
13ac0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
13ad0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
13ae0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
13af0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
13b00 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69   /* PEM_write_bi
13b10 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28  o_RSAPrivateKey(
13b20 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20  out, rsa, NULL, 
13b30 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e  NULL, 0, NULL, N
13b40 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42  ULL); */...    B
13b50 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
13b60 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63  ;.. .}....if ((c
13b70 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d  ert=X509_new())=
13b80 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54  =NULL) {...    T
13b90 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
13ba0 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
13bb0 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ating certificat
13bc0 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29  e request",NULL)
13bd0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
13be0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
13bf0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
13c00 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
13c10 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
13c20 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
13c30 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
13c40 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09  L_ERROR);...}...
13c50 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f  .X509_set_versio
13c60 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e  n(cert,2);...ASN
13c70 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35  1_INTEGER_set(X5
13c80 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d  09_get_serialNum
13c90 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c  ber(cert),serial
13ca0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
13cb0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
13cc0 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30  otBefore(cert),0
13cd0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
13ce0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
13cf0 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c  otAfter(cert),(l
13d00 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79  ong)60*60*24*day
13d10 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70  s);...X509_set_p
13d20 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29  ubkey(cert,pkey)
13d30 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67  ;....name=X509_g
13d40 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
13d50 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e  cert);....X509_N
13d60 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13d70 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d  _txt(name,"C", M
13d80 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
13d90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13da0 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  r *) k_C, -1, -1
13db0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
13dc0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13dd0 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
13de0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
13df0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13e00 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31   *) k_ST, -1, -1
13e10 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
13e20 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13e30 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53  xt(name,"L", MBS
13e40 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13e50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13e60 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_L, -1, -1, 
13e70 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13e80 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13e90 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52  (name,"O", MBSTR
13ea0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
13eb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13ec0 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_O, -1, -1, 0)
13ed0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13ee0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13ef0 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49  ame,"OU", MBSTRI
13f00 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
13f10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
13f20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
13f30 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13f40 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13f50 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
13f60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
13f70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
13f80 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_CN, -1, -1, 0)
13f90 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13fa0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13fb0 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53  ame,"Email", MBS
13fc0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13fd0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13fe0 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20  *) k_Email, -1, 
13ff0 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f  -1, 0);....X509_
14000 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  set_subject_name
14010 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09  (cert,name);....
14020 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63  if (!X509_sign(c
14030 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61  ert,pkey,EVP_sha
14040 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20  256())) {...    
14050 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
14060 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
14070 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
14080 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14090 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
140a0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
140b0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
140c0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
140d0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
140e0 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66  r signing certif
140f0 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09  icate",NULL);...
14100 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14110 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
14120 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
14130 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
14140 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
14150 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
14160 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
14170 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f      i=BIO_read(o
14180 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66  ut,buffer,sizeof
14190 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20  (buffer)-1);... 
141a0 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a     i=(i<0) ? 0 :
141b0 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72   i;...    buffer
141c0 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20  [i]='\0';...    
141d0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
141e0 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c  p,pemout,buffer,
141f0 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c  0);...    BIO_fl
14200 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20  ush(out);...    
14210 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09  BIO_free(out);..
14220 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
14230 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
14240 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20  s_file());...   
14250 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e   BIO_write_filen
14260 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b  ame(out,pemout);
14270 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14280 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
14290 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  rt);...    BIO_f
142a0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09  ree_all(out);...
142b0 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63  }....X509_free(c
142c0 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  ert);...EVP_PKEY
142d0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
142e0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
142f0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
14300 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28  0000L...BN_free(
14310 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20  bne);.#endif..  
14320 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20    }..}..break;. 
14330 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65     default:..bre
14340 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ak;.    }.    re
14350 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
14360 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
14370 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a  tData;.}.../****
14380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14390 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20  /./* Init       
143a0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
143b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
143c0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
143d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14400 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
14410 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20  Tls_Free --. *. 
14420 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
14430 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
14440 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
14450 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
14460 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
14470 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14480 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a  falls below 1. *
14490 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
144a0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
144b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
144c0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
144d0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14510 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
14520 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20  d.Tls_Free(char 
14530 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20  *blockPtr) {.   
14540 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
14550 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63   = (State *)bloc
14560 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  kPtr;..    dprin
14570 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
14580 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
14590 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
145a0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
145b0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
14600 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
14610 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
14620 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
14630 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
14640 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
14650 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
14660 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
14670 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
14680 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
14690 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
146a0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
146b0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
146c0 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
146d0 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
146e0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
146f0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
14700 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
14710 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
14720 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
14730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
14770 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28  .void Tls_Clean(
14780 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
14790 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
147a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
147b0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61  *.     * we're a
147c0 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
147d0 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
147e0 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a  hreaded.     */.
147f0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14800 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
14810 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
14820 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
14830 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
14840 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
14850 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
14860 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
14870 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14880 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
14890 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
148a0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
148b0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
148c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
148d0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
148e0 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
148f0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
14900 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
14910 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
14920 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
14930 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
14940 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
14950 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
14960 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
14970 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
14980 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
14990 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
149a0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
149b0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
149c0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
149d0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
149e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
149f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14a00 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
14a10 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
14a20 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
14a30 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
14a40 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14a50 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
14a60 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
14a70 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
14a80 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
14a90 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
14aa0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
14ab0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
14ac0 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
14ad0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
14ae0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
14af0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
14b00 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
14b10 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14b20 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
14b30 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
14b40 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
14b50 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
14b60 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
14b70 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
14b80 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54  ing");.}...#if T
14b90 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
14ba0 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e   > 8.#define MIN
14bb0 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23  _VERSION "9.0".#
14bc0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e  else.#define MIN
14bd0 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23  _VERSION "8.5".#
14be0 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  endif../*. *----
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14c30 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
14c40 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
14c50 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
14c60 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
14c70 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
14c80 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
14c90 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
14ca0 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
14cb0 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
14cc0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
14cd0 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
14ce0 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
14cf0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14d00 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
14d10 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
14d20 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
14d30 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
14d80 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
14d90 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
14da0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
14db0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
14dc0 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
14dd0 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
14de0 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
14df0 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
14e00 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
14e10 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
14e20 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49  BS.    if (Tcl_I
14e30 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
14e40 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29   MIN_VERSION, 0)
14e50 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
14e60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14e70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14e80 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69  if (Tcl_PkgRequi
14e90 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22  re(interp, "Tcl"
14ea0 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30  , MIN_VERSION, 0
14eb0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
14ec0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14ed0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
14ee0 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20  lsLibInit(0) != 
14ef0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
14f00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14f10 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
14f20 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
14f30 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29  brary", (char *)
14f40 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
14f50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14f60 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
14f70 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
14f80 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  p, "tls::ciphers
14f90 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
14fa0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
14fb0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
14fc0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
14fd0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
14fe0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14ff0 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
15000 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
15010 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
15020 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
15030 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15040 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15050 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15060 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
15070 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
15080 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
15090 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
150a0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
150b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
150c0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
150d0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d  interp, "tls::im
150e0 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
150f0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15100 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
15110 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15120 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15130 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15140 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72  p, "tls::unimpor
15150 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
15160 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15170 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
15180 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15190 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
151a0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
151b0 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  , "tls::status",
151c0 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28   StatusObjCmd, (
151d0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
151e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
151f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15200 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15210 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15220 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
15230 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
15240 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
15250 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15260 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15270 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15280 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15290 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d  misc", MiscObjCm
152a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
152b0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
152c0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
152d0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
152e0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
152f0 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
15300 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  ", ProtocolsObjC
15310 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15320 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
15330 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15340 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
15350 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e  ) {..Tcl_Eval(in
15360 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
15370 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a  Script);.    }..
15380 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
15390 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
153a0 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20  , PACKAGE_NAME, 
153b0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
153c0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15400 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65  *. *. *.Tls_Safe
15410 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15450 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63   *.Standard proc
15460 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62  edure required b
15470 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69  y 'load'.. *.Ini
15480 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78  tializes this ex
15490 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61  tension for a sa
154a0 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  fe interpreter..
154b0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154e0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
154f0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20  effects:. *..As 
15500 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
15510 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
15520 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65  A standard Tcl e
15530 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a  rror code.. *. *
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15570 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45  ------*. */.DLLE
15580 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
15590 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
155a0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
155b0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
155c0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54  ");.    return(T
155d0 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29  ls_Init(interp))
155e0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e  *. *. *.TlsLibIn
15630 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15670 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .Initializes SSL
15680 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65   library once pe
15690 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a  r application. *
156a0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156d0 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
156e0 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69  fects:. *..initi
156f0 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
15700 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  ry. *. *.Result:
15710 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  . *..none. *. *-
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15750 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69  -----*. */.stati
15760 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74  c int TlsLibInit
15770 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a  (int uninitializ
15780 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  e) {.    static 
15790 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
157a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  = 0;.    int sta
157b0 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69  tus = TCL_OK;.#i
157c0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
157d0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
157e0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
157f0 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75  S).    size_t nu
15800 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  m_locks;.#endif.
15810 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69  .    if (uniniti
15820 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69  alize) {..if (!i
15830 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20  nitialized) {.. 
15840 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65     dprintf("Aske
15850 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a  d to uninitializ
15860 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f  e, but we are no
15870 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b  t initialized");
15880 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
15890 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69  L_OK);..}...dpri
158a0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
158b0 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23  initialize");..#
158c0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
158d0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
158e0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
158f0 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  DS)..Tcl_MutexLo
15900 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09  ck(&init_mx);...
15910 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20  if (locks) {..  
15920 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09    free(locks);..
15930 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c      locks = NULL
15940 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  ;..    locksCoun
15950 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66  t = 0;..}.#endif
15960 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ..initialized = 
15970 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
15980 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
15990 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
159a0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
159b0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
159c0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
159d0 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20  turn(TCL_OK);.  
159e0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69    }..    if (ini
159f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72  tialized) {..dpr
15a00 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75  intf("Called, bu
15a10 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76  t using cached v
15a20 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28  alue");..return(
15a30 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a  status);.    }..
15a40 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
15a50 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
15a60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15a70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15a80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
15a90 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
15aa0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
15ab0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
15ac0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
15ad0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15ae0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15af0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15b00 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
15b10 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
15b20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
15b30 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
15b40 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
15b50 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
15b60 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
15b70 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
15b80 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
15b90 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
15ba0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
15bb0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
15bc0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
15bd0 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
15be0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
15bf0 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
15c00 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
15c10 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
15c20 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
15c30 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
15c40 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
15c50 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
15c60 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
15c70 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
15c80 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a  );..#if 0.    /*
15c90 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f  .     * XXX:TODO
15ca0 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f  : Remove this co
15cb0 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  de and replace i
15cc0 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20  t with a check. 
15cd0 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68      * for enough
15ce0 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20   entropy and do 
15cf0 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74  not try to creat
15d00 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a  e our own.     *
15d10 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70   terrible entrop
15d20 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a  y.     */.    /*
15d30 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65  .     * Seed the
15d40 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
15d50 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  enerator in the 
15d60 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20  SSL library,.   
15d70 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f    * using the do
15d80 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74  /while construct
15d90 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
15da0 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a  bug note in the.
15db0 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46       * OpenSSL F
15dc0 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77  AQ at http://www
15dd0 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70  .openssl.org/sup
15de0 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53  port/faq.html#US
15df0 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ER1.     *.     
15e00 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68  * The crux of th
15e10 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61  e problem is tha
15e20 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73  t Solaris 7 does
15e30 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20   not have a.    
15e40 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f   * /dev/random o
15e50 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64  r /dev/urandom d
15e60 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e  evice so it cann
15e70 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68  ot gather enough
15e80 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20  .     * entropy 
15e90 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65  from the RAND_se
15ea0 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e  ed() when TLS in
15eb0 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65  itializes and re
15ec0 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20  fuses.     * to 
15ed0 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c  go further. Earl
15ee0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
15ef0 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20  OpenSSL carried 
15f00 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  on regardless.. 
15f10 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64      */.    srand
15f20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
15f30 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20  time((time_t *) 
15f40 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b  NULL));.    do {
15f50 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
15f60 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  < 16; i++) {..  
15f70 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20    rnd_seed[i] = 
15f80 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e  1 + (char) (255.
15f90 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44  0 * rand()/(RAND
15fa0 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09  _MAX+1.0));..}..
15fb0 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65  RAND_seed(rnd_se
15fc0 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73  ed, sizeof(rnd_s
15fd0 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69  eed));.    } whi
15fe0 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28  le (RAND_status(
15ff0 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ) != 1);.#endif.
16000 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
16010 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
16020 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
16030 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
16040 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
16050 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
16060 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a           n(status);.}.