Hex Artifact Content

Artifact b2882089e7b81317d15f6c01c79ca1278f25e5651dfea211565f80e5d738ae16:


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: 20 20 20 20 20 20 20 20 76 65 72 20 3d 20 22 6e          ver = "n
1be0: 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  one";..break;.  
1bf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20    default:..ver 
1c00: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72  = "unknown";..br
1c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c20: 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f  switch (content_
1c30: 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65  type) {.    case
1c40: 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a   SSL3_RT_HEADER:
1c50: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72  ..type = "Header
1c60: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
1c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1c80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1c90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ca0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1cb0: 70 65 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  pe";.        bre
1cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1cd0: 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48  3_RT_CHANGE_CIPH
1ce0: 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d  ER_SPEC:..type =
1cf0: 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22   "Change Cipher"
1d00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d20: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d  T_ALERT:..type =
1d30: 20 22 41 6c 65 72 74 22 3b 0a 20 20 20 20 20 20   "Alert";.      
1d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 20 20 20 20 20 20  ndshake";.      
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d90: 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43  e SSL3_RT_APPLIC
1da0: 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70  ATION_DATA:..typ
1db0: 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a  e = "App Data";.
1dc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49  , buffer, min(BI
1f10: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20  O_pending(bio), 
1f20: 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 6e  14999));..n = (n
1f30: 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75  <0) ? 0 : n;..bu
1f40: 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76  ffer[n] = 0;..(v
1f50: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69  oid)BIO_flush(bi
1f60: 6f 29 3b 0a 20 09 42 49 4f 5f 66 72 65 65 28 62  o);. .BIO_free(b
1f70: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f  io);.   }..    /
1f80: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
1f90: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
1fa0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
1fb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
1fc0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1fd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1fe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1ff0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
2010: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
2020: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2030: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2040: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2050: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2060: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2070: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2080: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2090: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
20a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
20b0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
20d0: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
20e0: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
20f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2100: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2110: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
2130: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2150: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2160: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2170: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
2180: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2190: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
21b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
21c0: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
21d0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
21e0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
21f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2200: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2210: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2220: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2230: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2240: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2250: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
2260: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
22b0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
22c0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
22d0: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
22e0: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
22f0: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2300: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2310: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2320: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
2330: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
2340: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
2350: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
2360: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
2370: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
2380: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
2390: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
23a0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
23b0: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
23c0: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63  cks:. *.certific
23d0: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65  ate chain is che
23e0: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  cked starting wi
23f0: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e  th the deepest n
2400: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09  esting level. *.
2410: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63    (the root CA c
2420: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20  ertificate) and 
2430: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f  worked upward to
2440: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74   the peer's cert
2450: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20  ificate.. *.All 
2460: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76  signatures are v
2470: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69  alid, current ti
2480: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72  me is within fir
2490: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69  st and last vali
24a0: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68  dity time.. *.Ch
24b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72  eck that the cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75  tificate is issu
24d0: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72  ed by the issuer
24e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
24f0: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  uer.. *.Check th
2500: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  e revocation sta
2510: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72  tus for each cer
2520: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65  tificate.. *.Che
2530: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20  ck the validity 
2540: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c  of the given CRL
2550: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65   and the cert re
2560: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e  vocation status.
2570: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f  . *.Check the po
2580: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68  licies of all th
2590: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20  e certificates. 
25a0: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65  *. * Args. *.pre
25b0: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61  verify_ok indica
25c0: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  tes whether the 
25d0: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69  certificate veri
25e0: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20  fication passed 
25f0: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20  (1) or not (0). 
2600: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2610: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e  .A callback boun
2620: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20  d to the socket 
2630: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  may return one o
2640: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20  f:. *.    0...- 
2650: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2660: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69  is deemed invali
2670: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61  d, send verifica
2680: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69  tion. *....  fai
2690: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65  lure alert to pe
26a0: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  er, and terminat
26b0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
26c0: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65      1...- the ce
26d0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
26e0: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69  med valid, conti
26f0: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61  nue with handsha
2700: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79  ke.. *.    empty
2710: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61   string.- no cha
2720: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61  nge to certifica
2730: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a  te validation. *
2740: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2750: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
2760: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
2770: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
2780: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2790: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
27a0: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
27b0: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
27c0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d  re reason. *. *-
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
2820: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  t.VerifyCallback
2830: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54  (int ok, X509_ST
2840: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a  ORE_CTX *ctx) {.
2850: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
2860: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a  Ptr;.    SSL   *
2870: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30  ssl..= (SSL*)X50
2880: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
2890: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c  ex_data(ctx, SSL
28a0: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30  _get_ex_data_X50
28b0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28  9_STORE_CTX_idx(
28c0: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63  ));.    X509  *c
28d0: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  ert..= X509_STOR
28e0: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e  E_CTX_get_curren
28f0: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20  t_cert(ctx);.   
2900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
2910: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67  .= (State*)SSL_g
2920: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29  et_app_data(ssl)
2930: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
2940: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
2950: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
2960: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35   int depth..= X5
2970: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2980: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78  _error_depth(ctx
2990: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09  );.    int err..
29a0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
29b0: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b  _get_error(ctx);
29c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
29d0: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b  erify: %d", ok);
29e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
29f0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
2a00: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69  _Obj*)NULL) {..i
2a10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c  f (statePtr->vfl
2a20: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59  ags & SSL_VERIFY
2a30: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
2a40: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65  _CERT) {..    re
2a50: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65  turn ok;..} else
2a60: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31   {..    return 1
2a70: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
2a80: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c  if (cert == NULL
2a90: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29   || ssl == NULL)
2aa0: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
2ab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2ac0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2ad0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
2ae0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2af0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2b00: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2b10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2b40: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2b50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2b70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2b80: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
2b90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2ba0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2bb0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2c00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2c30: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2c40: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2c80: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
2c90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2cb0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2cd0: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2ce0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2cf0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2d00: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f    /* Prevent I/O
2d10: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20   while callback 
2d20: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a  is in progress *
2d30: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  /.    /* statePt
2d40: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2d50: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f  TCL_CALLBACK; */
2d60: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2d70: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2d80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2d90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2da0: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2db0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2dc0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2dd0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2de0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2df0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2e00: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2e10: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2e20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2e30: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2e40: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2e50: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2e60: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2eb0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2ec0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2ed0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2ee0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2ef0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2f00: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2f10: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2f20: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2f30: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2f40: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
2f50: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
2f60: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
2f70: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
2fd0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
2fe0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
2ff0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3000: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
3010: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
3020: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
3030: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
3040: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3050: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3060: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3090: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
30a0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
30b0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
30c0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
30d0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
30e0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
30f0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3100: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3110: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3120: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3130: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3140: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3150: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3160: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3180: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
31b0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
31c0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
31d0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
31e0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
31f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3200: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3230: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
3240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3250: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3260: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55  sult(interp), NU
3270: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  LL)) != NULL) {.
3280: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
32c0: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  -1));..    } els
32d0: 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54  e {..listPtr = T
32e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
32f0: 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28   NULL);..while (
3300: 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  (err = ERR_get_e
3310: 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a  rror()) != 0) {.
3320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3340: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
3350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3360: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
3370: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
3380: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
3390: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
33b0: 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d   listPtr);.    }
33c0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
33d0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
33e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
33f0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3400: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
3410: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
3420: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
3430: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3440: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
3450: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79  ------. *. * Key
34a0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  LogCallback --. 
34b0: 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69  *. *.Write recei
34c0: 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20  ved key data to 
34d0: 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20  log file.. *. * 
34e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
34f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3540: 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61  */.void KeyLogCa
3550: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3560: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61   *ssl, const cha
3570: 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63  r *line) {.    c
3580: 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e  har *str = geten
3590: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
35a0: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a  ;.    FILE *fd;.
35b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
35c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
35d0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f  (str) {..fd = fo
35e0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09  pen(str, "a");..
35f0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c  fprintf(fd, "%s\
3600: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73  n",line);..fclos
3610: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  e(fd);.    }.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3670: 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63  Password Callbac
3680: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  k --. *. *.Calle
3690: 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72  d when a passwor
36a0: 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20  d for a private 
36b0: 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72  key loading/stor
36c0: 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72  ing a PEM. *.cer
36d0: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
36e0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
36f0: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
3700: 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74  and returns. *.t
3710: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3720: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3730: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3740: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3750: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3760: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3770: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
3780: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
3790: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
37a0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
37b0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
37c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3810: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3820: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3830: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3840: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3850: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
3870: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
3880: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3890: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
38a0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
38b0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
38c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20      int code;.. 
38d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
38e0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ed");..    /* If
38f0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73   no callback, us
3900: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61  e default callba
3910: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ck */.    if (st
3920: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3930: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
3940: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
3950: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
3960: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
3970: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
3980: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
3990: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
39a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
39b0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20  sult(interp);.. 
39c0: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
39d0: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
39e0: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
39f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74   (int)strlen(ret
3a00: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
3a10: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
3a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
3a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
3a70: 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54  password);.    T
3a80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3a90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3aa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3ab0: 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f  tringObj("passwo
3ac0: 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  rd", -1));.    T
3ad0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3ae0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3af0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
3b00: 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a  ntObj(rwflag));.
3b10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3b20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3b30: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3b40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29  _NewIntObj(size)
3b50: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
3b60: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3b70: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3b80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3b90: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3ba0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
3bb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
3bc0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
3bd0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3be0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
3bf0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
3c00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
3c10: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3c20: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
3c30: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
3c40: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
3c50: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
3c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
3c70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3c80: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
3c90: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
3ca0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
3cb0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
3cc0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  if.    }.    Tcl
3cd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3ce0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
3cf0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3d00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3d10: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65  .    /* If succe
3d20: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b  ssful, pass back
3d30: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3d40: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66   and truncate if
3d50: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20   too long */.   
3d60: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
3d70: 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b  _OK) {..int len;
3d80: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3d90: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3da0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3db0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3dc0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
3dd0: 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20   (len > size-1) 
3de0: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a  {..    len = siz
3df0: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
3e00: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3e10: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
3e20: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
3e30: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3e40: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
3e50: 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20  return(len);.   
3e60: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3e80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
3e90: 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn -1;.}.../*. 
3ea0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69  ----. *. * Sessi
3ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  on Callback for 
3f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
3f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e  .Called when a n
3f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64  ew session is ad
3f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65  ded to the cache
3f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09  . In TLS 1.3. *.
3f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65  this may be rece
3f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ived multiple ti
3f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61  mes after the ha
3f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09  ndshake. For. *.
3f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  earlier versions
3fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72  , this will be r
3fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74  eceived during t
3fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  he handshake.. *
3fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65  .This is the pre
3fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62  ferred way to ob
3ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65  tain a resumable
4000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20   session.. *. * 
4010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
4020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65   codes:. *.0 = e
4070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69  rror where sessi
4080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64  on will be immed
4090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66  iately removed f
40a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
40b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73   cache.. *.1 = s
40c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70  uccess where app
40d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e   retains session
40e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68   in session cach
40f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c  e, and must call
4100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65   SSL_SESSION_fre
4110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20  e() when done.. 
4120: 2a 0a 20 2a 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 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61  ic int.SessionCa
4180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
41a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
41b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
41c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
41d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
41e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
41f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
4230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
4250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
4270: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
4280: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
4290: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
42a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
42b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
42c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
42d0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4300: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
4310: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4320: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4330: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
4360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
43a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
43b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
43c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
43d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29  j("session", -1)
43e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
43f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4410: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4420: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4440: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4450: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
4460: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
4470: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
4480: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
4490: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
44a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
44b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
44c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
44d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
44e0: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c  ion_id, (int) ul
44f0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
4500: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
4510: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
4520: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
4530: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
4540: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
4550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4570: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
4580: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
4590: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  int) len2));..  
45a0: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
45b0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
45c0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
45d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
45e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
45f0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
4600: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
4610: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
4620: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
4630: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
4640: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
4650: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
4660: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4670: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
4680: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
4690: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
46a0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
46b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
46c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
46d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a  -------------. *
4720: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63  . * ALPN Callbac
4730: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e  k for Servers an
4740: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66  d NPN Callback f
4750: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4760: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74  . *.Perform prot
4770: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
4780: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65  h2, h3, etc.) se
4790: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  lection for the.
47a0: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e   *.incoming conn
47b0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61  ection. Called a
47c0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73  fter Hello and s
47d0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  erver callbacks.
47e0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20  . *.Where 'out' 
47f0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  is selected prot
4800: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73  ocol and 'in' is
4810: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74   the peer advert
4820: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ised list.. *. *
4830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4880: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4890: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41  TLSEXT_ERR_OK: A
48a0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  LPN protocol sel
48b0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
48c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
48d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
48e0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
48f0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65  There was no ove
4900: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65  rlap between the
4910: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20   client's. *.   
4920: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61   supplied list a
4930: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f  nd the server co
4940: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65  nfiguration. The
4950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
4960: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09   be aborted.. *.
4970: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4980: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  OACK: ALPN proto
4990: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
49a0: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20  , e.g., because 
49b0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70  no ALPN. *.    p
49c0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e  rotocols are con
49d0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
49e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
49f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4a00: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
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 2d 2d 0a  ---------------.
4a50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41   */.static int.A
4a60: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LPNCallback(cons
4a70: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
4a80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4a90: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4aa0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
4ab0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4ac0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
4ad0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
4ae0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
4af0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4b00: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
4b10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4b20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4b30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4b40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4b50: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
4b60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
4b70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
4b80: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
4b90: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
4ba0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4bb0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4bc0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
4bd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
4be0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
4bf0: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20  next_proto(out, 
4c00: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
4c10: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
4c20: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
4c30: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
4c50: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74  IATED) {../* Mat
4c60: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73  ch found */..res
4c70: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4c80: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4c90: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e   {../* OPENSSL_N
4ca0: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20  PN_NO_OVERLAP = 
4cb0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
4cc0: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72  se first item fr
4cd0: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63  om client protoc
4ce0: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20  ol list */..res 
4cf0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4d00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4d10: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4d20: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
4d30: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4d40: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20  rn res;.    }.. 
4d50: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4d60: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4d70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4d80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4d90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
4da0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4db0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4dc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
4de0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
4df0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4e00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4e10: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
4e20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4e30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4e40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4e50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4e60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4e70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4e80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4e90: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29  ngObj(*out, -1))
4ea0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4ec0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4ed0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
4ee0: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45  (res == SSL_TLSE
4ef0: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20  XT_ERR_OK));..  
4f00: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
4f10: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
4f20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4f30: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
4f40: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
4f50: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
4f60: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
4f70: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c  _NOACK;.    } el
4fa0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
4fb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
4fc0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4fd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
4fe0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4ff0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20  _ALERT_FATAL;.  
5000: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5010: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5030: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20  --------------. 
5080: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50  *. * Advertise P
5090: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63  rotocols Callbac
50a0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f  k for Next Proto
50b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20  col Negotiation 
50c0: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48  (NPN) in ServerH
50d0: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61  ello --. *. *.ca
50e0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20  lled when a TLS 
50f0: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c  server needs a l
5100: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64  ist of supported
5110: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e   protocols for N
5120: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20  ext. *.Protocol 
5130: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a  Negotiation.. *.
5140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5160: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65  ffects:. *. * Re
5170: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5180: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5190: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73  : NPN protocol s
51a0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
51b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
51c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
51d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20  _ERR_NOACK: NPN 
51e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
51f0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
5200: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5210: 0a 20 2a 0a 20 2a 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 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
5260: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61  fdef USE_NPN.sta
5270: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62  tic int.NPNCallb
5280: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
5290: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
52a0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
52b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74  nsigned int *out
52c0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
52d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
52e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
52f0: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  arg;..    dprint
5300: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5310: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
5320: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
5330: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5340: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5360: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  Set protocols li
5370: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  st */.    if (st
5380: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
5390: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20  = NULL) {..*out 
53a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
53b0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73  os;..*outlen = s
53c0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
53d0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
53e0: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a  {..*out = NULL;.
53f0: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72  .*outlen = 0;..r
5400: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5410: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c  }.    return SSL
5430: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5440: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a  }.#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 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61  ---. *. * SNI Ca
54a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
54b0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  rs --. *. *.Perf
54c0: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20  orm server-side 
54d0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c  SNI hostname sel
54e0: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63  ection after rec
54f0: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e  eiving SNI exten
5500: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e  sion. *.in Clien
5510: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20  t Hello. Called 
5520: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c  after hello call
5530: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20  back but before 
5540: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  ALPN callback.. 
5550: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5560: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5570: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
5580: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
5590: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
55a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
55b0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
55c0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  K: SNI hostname 
55d0: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  is accepted. The
55e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
55f0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5600: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5610: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61  ATAL: SNI hostna
5620: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5630: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5640: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f  on. *.    is abo
5650: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f  rted. Default fo
5660: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41  r alert is SSL_A
5670: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5680: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  AME.. *.SSL_TLSE
5690: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
56a0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61  NING: SNI hostna
56b0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
56c0: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72  ed, warning aler
56d0: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e  t. *.    sent (n
56e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
56f0: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f  TLSv1.3). The co
5700: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5710: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5720: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49  T_ERR_NOACK: SNI
5730: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5740: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f   accepted and no
5750: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a  t acknowledged,.
5760: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53   *.    e.g. if S
5770: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  NI has not been 
5780: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20  configured. The 
5790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
57a0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
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 2d 2d 0a 20  --------------. 
57f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e  */.static int.SN
5800: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  ICallback(const 
5810: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
5820: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
5830: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5840: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
5850: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
5860: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
5870: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
5880: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
5890: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
58a0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61  de, res;.    cha
58b0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20  r *servername = 
58c0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e  NULL;..    dprin
58d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
58e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
58f0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
5900: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5910: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5920: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5930: 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   Only works for 
5940: 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c  TLS 1.2 and earl
5950: 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65  ier */.    serve
5960: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f  rname = SSL_get_
5970: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
5980: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
5990: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  host_name);.    
59a0: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20  if (!servername 
59b0: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d  || servername[0]
59c0: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74   == '\0') {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
59e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
59f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5a00: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
5a10: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
5a20: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5a30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ERR_OK;.    }.. 
5a40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
5a50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
5a60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
5a70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
5a80: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
5a90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5aa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5ab0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e  NewStringObj("sn
5ad0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  i", -1));.    Tc
5ae0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5af0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5b00: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5b10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5b20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5b30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5b70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5b80: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20  gObj(servername 
5b90: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
5ba0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5bb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5bc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5bd0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5be0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5bf0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5c00: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5c10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5c20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5c30: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65  T_WARNING;..*ale
5c40: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5c50: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5c60: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5c70: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5c80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
5c90: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
5ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5cb0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
5cc0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5cd0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5ce0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  AL;..*alert = SS
5cf0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5d00: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5d10: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5d20: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  1.3 */.    }.   
5d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5d40: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5d50: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5d60: 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 43 6c  -------. *. * Cl
5db0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68  ientHello Handsh
5dc0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ake Callback for
5dd0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
5de0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72  *.Used by server
5df0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20   to examine the 
5e00: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
5e10: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74  cation (SNI) ext
5e20: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64  ension. *.provid
5e30: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74  ed by the client
5e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c   in order to sel
5e50: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ect an appropria
5e60: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  te certificate t
5e70: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e  o. *.present, an
5e80: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e  d make other con
5e90: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73  figuration adjus
5ea0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20  tments relevant 
5eb0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20  to that server. 
5ec0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63  *.name and its c
5ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
5ee0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70  is includes swap
5ef0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73  ping out the ass
5f00: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43  ociated. *.SSL_C
5f10: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69  TX pointer, modi
5f20: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  fying the server
5f30: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69  's list of permi
5f40: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e  tted TLS version
5f50: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74  s,. *.changing t
5f60: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68  he server's ciph
5f70: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f  er list in respo
5f80: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  nse to the clien
5f90: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c  t's cipher list,
5fa0: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20   etc.. *.Called 
5fb0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41  before SNI and A
5fc0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  LPN callbacks.. 
5fd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5fe0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5ff0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
6000: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
6010: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
6020: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
6030: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6040: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20  _RETRY: suspend 
6050: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61  the handshake, a
6060: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
6070: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
6080: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
6090: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  y. *.SSL_CLIENT_
60a0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69  HELLO_ERROR: fai
60b0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20  lure, terminate 
60c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20  connection. Set 
60d0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63  alert to error c
60e0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  ode.. *.SSL_CLIE
60f0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
6100: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 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: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6160: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28  t.HelloCallback(
6170: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
6180: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64  int *alert, void
6190: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
61a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
61b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
61c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
61d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
61e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
61f0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
6200: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20  int code, res;. 
6210: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
6220: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63  ervername;.    c
6230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6240: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f  ar *p;.    size_
6250: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67  t len, remaining
6260: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
6270: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
6280: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
6290: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
62a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
62b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
62c0: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
62d0: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28  lse if (ssl == (
62e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c  const SSL *)NULL
62f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64   || arg == (void
6300: 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75   *)NULL) {..retu
6310: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6320: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6330: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d  ..    /* Get nam
6340: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53  es */.    if (!S
6350: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  SL_client_hello_
6360: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c  get0_ext(ssl, TL
6370: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72  SEXT_TYPE_server
6380: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61  _name, &p, &rema
6390: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e  ining) || remain
63a0: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
63b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
63c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
63d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
63e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6400: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
6410: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
6420: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74  he supplied list
6430: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20   of names. */.  
6440: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
6450: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
6460: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
6470: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d   (len + 2 != rem
6480: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72  aining) {..*aler
6490: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
64a0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
64b0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
64c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
64d0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
64e0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
64f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  en;..    /* The 
6500: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65  list in practice
6510: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67   only has a sing
6520: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77  le element, so w
6530: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20  e only consider 
6540: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a  the first one. *
6550: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6560: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b  ing == 0 || *p++
6570: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54   != TLSEXT_NAMET
6580: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b  YPE_host_name) {
6590: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
65a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
65b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
65c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
65d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
65e0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
65f0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  --;..    /* Now 
6600: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70  we can finally p
6610: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65  ull out the byte
6620: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
6630: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e  actual hostname.
6640: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6650: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
6660: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6670: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6680: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6690: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
66a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
66b0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
66c0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
66d0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
66e0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65  if (len + 2 > re
66f0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6700: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6710: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6720: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6730: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6750: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
6760: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ;.    servername
6770: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
6780: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  )p;..    /* Crea
6790: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
67a0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
67b0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
67c0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
67d0: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
67e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
67f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6810: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29  bj("hello", -1))
6820: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6830: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6840: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
6850: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
6860: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
6870: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
6880: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
6890: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
68a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
68b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
68c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
68d0: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c  vername, (int) l
68e0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
68f0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6900: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6910: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6920: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6930: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6940: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6950: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6960: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6970: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6980: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6990: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
69a0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
69b0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
69c0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
69d0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
69e0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
69f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6a00: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a10: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6a20: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6a30: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6a40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6a50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6a60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6a70: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6aa0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6ac0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 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 0a 20 2a 0a 20 2a  ----------. *. *
6b10: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6b20: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6b30: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6b40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6b50: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6b60: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6b70: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6b80: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6b90: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6ba0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6bb0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6bc0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6bd0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6be0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6bf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6c00: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6c10: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6c20: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
6c30: 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6c80: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6c90: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
6ca0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31  ", "ssl3", "tls1
6cb0: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ", "tls1.1", "tl
6cc0: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c  s1.2", "tls1.3",
6cd0: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72   NULL.};.enum pr
6ce0: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53  otocol {.    TLS
6cf0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
6d00: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54   TLS_TLS1, TLS_T
6d10: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_1, TLS_TLS1_
6d20: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54  2, TLS_TLS1_3, T
6d30: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74  LS_NONE.};..stat
6d40: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
6d50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
6d60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
6d70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6d80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6d90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6da0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
6db0: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
6dc0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
6dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
6de0: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
6df0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
6e00: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
6e10: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46  har *cp, buf[BUF
6e20: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e  SIZ];.    int in
6e30: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30  dex, verbose = 0
6e40: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20  , use_supported 
6e50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  = 0;.    const S
6e60: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
6e70: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
6e80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6e90: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
6ea0: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
6eb0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
6ec0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6ed0: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
6ee0: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
6ef0: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
6f00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6f10: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
6f20: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
6f30: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
6f40: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
6f50: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
6f60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f80: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
6f90: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
6fa0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
6fb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
6fc0: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
6fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6ff0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7000: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
7010: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7020: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
7030: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
7040: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7050: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7060: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7070: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7080: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
7090: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
70a0: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a  ..case TLS_SSL2:
70b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
70c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
70d0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
70e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
70f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7100: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20  L_NO_SSL2)..    
7110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7120: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7130: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7170: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7180: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d  method = SSLv2_m
7190: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
71a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
71b0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
71c0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
71d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71e0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
71f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7200: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  L3_METHOD)..    
7210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7220: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7230: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7240: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7250: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7270: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7280: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d  method = SSLv3_m
7290: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
72a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
72b0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
72c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
72d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
72e0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
72f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7300: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
7310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7320: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7330: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7340: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7350: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7360: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7370: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7380: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d  method = TLSv1_m
7390: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
73a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
73b0: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66  _TLS1_1:.#if def
73c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
73d0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
73e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  SL_NO_TLS1_1) ||
73f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7400: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
7410: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
7420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7430: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7440: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7450: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
7460: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7470: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7480: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7490: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28   TLSv1_1_method(
74a0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
74b0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
74c0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  2:.#if defined(N
74d0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
74e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
74f0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
7500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7510: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_2_METHOD)..  
7520: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7530: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7540: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
7550: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7560: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7570: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7580: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7590: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
75a0: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
75b0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
75c0: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
75d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
75e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
75f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7600: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7620: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7630: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7640: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7650: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7670: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7680: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20  TLS_method();.. 
7690: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
76a0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
76b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
76c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f  SION);..    SSL_
76d0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
76e0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
76f0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7700: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64  .    break;.#end
7710: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
7720: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d    method = TLS_m
7730: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72  ethod();..    br
7740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7750: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7760: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
7770: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20  f (ctx == NULL) 
7780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
77a0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
77b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
77c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d      }..    ssl =
77d0: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
77e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
77f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
7800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7810: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
7820: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
7830: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tx);..return TCL
7840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7850: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61     /* Use list a
7860: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c  nd order as woul
7870: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43  d be sent in a C
7880: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c  lientHello or al
7890: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  l available ciph
78a0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75  ers */.    if (u
78b0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
78c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73  .sk = SSL_get1_s
78d0: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73  upported_ciphers
78e0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (ssl);.    } els
78f0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  e {..sk = SSL_ge
7900: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  t_ciphers(ssl);.
7910: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
7920: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  k != NULL) {..if
7930: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20   (!verbose) {.. 
7940: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7950: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7960: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7970: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7990: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
79a0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
79b0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
79c0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
79d0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
79e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
79f0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7a00: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7a10: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7a20: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7a30: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7a40: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7a50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7a60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
7a80: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
7a90: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
7aa0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
7ab0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
7ac0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
7ad0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
7ae0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
7af0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
7b00: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
7b10: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
7b20: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
7b30: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
7b40: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
7b50: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
7b60: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
7b70: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
7b80: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
7b90: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
7ba0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
7bb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7bc0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
7bd0: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75   (int) strlen(bu
7be0: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  f));...} else {.
7bf0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7c00: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55  ToObj(objPtr, "U
7c10: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09  NKNOWN\n", 8);..
7c20: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  .}..    }..}..if
7c30: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
7c40: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43   {..    sk_SSL_C
7c50: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a  IPHER_free(sk);.
7c60: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  .}.    }.    SSL
7c70: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20  _free(ssl);.    
7c80: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
7c90: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
7ca0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
7cb0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
7cc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
7cd0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
7ce0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63  ---. *. * Protoc
7d40: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  olsObjCmd -- lis
7d50: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74  t available prot
7d60: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73  ocols. *. *.This
7d70: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
7d80: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
7d90: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f   the "tls::proto
7da0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  cols" command. *
7db0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
7dc0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  le protocols.. *
7dd0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7de0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7df0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
7e00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7e10: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
7e20: 2d 2d 2d 2d 2d 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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
7e70: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
7e80: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7e90: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7ea0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7eb0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7ec0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7ed0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7ee0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
7ef0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7f00: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b  if (objc != 1) {
7f10: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7f20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7f30: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e  jv, "");..return
7f40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7f50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
7f60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f  _error();..    o
7f70: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7f80: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
7f90: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
7fa0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
7fb0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
7fc0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
7fd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7fe0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
7ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8010: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8020: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8030: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20  cols[TLS_SSL2], 
8040: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
8050: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8060: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
8070: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
8080: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8090: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
80a0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
80b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
80c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
80d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
80e0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
80f0: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  SSL3], -1));.#en
8100: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8110: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
8120: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8130: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
8140: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8150: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  S1_METHOD).    T
8160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
81a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31  ls[TLS_TLS1], -1
81b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
81c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
81d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
81e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
81f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8200: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
8210: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8230: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8240: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8250: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8260: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29  TLS_TLS1_1], -1)
8270: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8280: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
8290: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
82a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
82b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
82d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
82e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
82f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8300: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8310: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8320: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29  LS_TLS1_2], -1))
8330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
8350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
8370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8390: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
83a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
83b0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
83c0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _3], -1));.#endi
83d0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  f..    Tcl_SetOb
83e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
83f0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
8400: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
8410: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
8420: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
8430: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
8480: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
8490: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
84a0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
84b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
84c0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
84d0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
84e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
84f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
8500: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
8510: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
8520: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
8530: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
8540: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
8550: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
8560: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
8570: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
8580: 2d 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 0a 20 2a 2f  ------------. */
85c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64  .static int Hand
85d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65  shakeObjCmd(Clie
85e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
85f0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8600: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8610: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8620: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
8630: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20  l_Channel chan; 
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
8650: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
8660: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
8670: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20  tate *statePtr; 
8680: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74         /* client
8690: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
86a0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  ocket */.    con
86b0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  st char *errStr 
86c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
86d0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ret = 1;.    int
86e0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64   err = 0;..    d
86f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
8700: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
8710: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
8720: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8730: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
8740: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
8750: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8760: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8770: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
8780: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
8790: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
87a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
87b0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
87c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
87d0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
87e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
87f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8810: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8820: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8830: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8840: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8850: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8860: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
8870: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
8880: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
8890: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
88a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
88b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
88c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
88d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
88e0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
88f0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
8900: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8910: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8920: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8930: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  KE", "CHANNEL", 
8940: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
8950: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
8960: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8970: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
8980: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
8990: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
89a0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
89b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
89c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
89d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
89e0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
89f0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
8a00: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
8a10: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
8a20: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
8a30: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
8a40: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
8a50: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
8a60: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8a70: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
8a80: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
8a90: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
8aa0: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
8ab0: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
8ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8ad0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67  ret < 0) {..long
8ae0: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72   result;..errStr
8af0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
8b00: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75  ;..Tcl_ResetResu
8b10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c  lt(interp);..Tcl
8b20: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a  _SetErrno(err);.
8b30: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c  ..if (!errStr ||
8b40: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29   (*errStr == 0))
8b50: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d   {..    errStr =
8b60: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28   Tcl_PosixError(
8b70: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63  interp);..}...Tc
8b80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8b90: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b  nterp, "handshak
8ba0: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72  e failed: ", err
8bb0: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  Str, (char *) NU
8bc0: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c  LL);..if ((resul
8bd0: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  t = SSL_get_veri
8be0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
8bf0: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30  tr->ssl)) != X50
8c00: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  9_V_OK) {..    T
8c10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8c20: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f  interp, " due to
8c30: 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79  : ", X509_verify
8c40: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
8c50: 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68 61  ng(result), (cha
8c60: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09  r *) NULL);..}..
8c70: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
8c80: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
8c90: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41  "HANDSHAKE", "FA
8ca0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
8cb0: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28  NULL);..dprintf(
8cc0: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45  "Returning TCL_E
8cd0: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68  RROR with handsh
8ce0: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ake failed: %s",
8cf0: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72   errStr);..retur
8d00: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
8d10: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
8d20: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  err != 0) {..   
8d30: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e   dprintf("Got an
8d40: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f   error with a co
8d50: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b  mpleted handshak
8d60: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72  e: err = %i", er
8d70: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b  r);..}..ret = 1;
8d80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
8d90: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
8da0: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20  CL_OK with data 
8db0: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20  \"%i\"", ret);. 
8dc0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
8dd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
8de0: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b  NewIntObj(ret));
8df0: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f  .    return(TCL_
8e00: 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  OK);..clientData
8e10: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
8e20: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8e70: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d   ImportObjCmd --
8e80: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
8e90: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
8ea0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
8eb0: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  "ssl" command. *
8ec0: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d  . *.The ssl comm
8ed0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f  and pushes SSL o
8ee0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e  ver a (newly con
8ef0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b  nected) tcp sock
8f00: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  et. *. * Results
8f10: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
8f20: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
8f30: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
8f40: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
8f50: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
8f60: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
8f70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8f80: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
8fc0: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d   int.ImportObjCm
8fd0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
8fe0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
8ff0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
9000: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
9010: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
9020: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
9030: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
9040: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
9050: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
9060: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
9070: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
9080: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
9090: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  */.    SSL_CTX *
90a0: 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ctx.        = NU
90b0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
90c0: 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20  *script.        
90d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
90e0: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20  Obj *password.  
90f0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
9100: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09    Tcl_Obj *vcmd.
9110: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9120: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
9130: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
9140: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
9150: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
9160: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9170: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
9180: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
9190: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20  t idx, len;.    
91a0: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20  int flags..     
91b0: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49     = TLS_TCL_INI
91c0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
91d0: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09  r..        = 0;.
91e0: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
91f0: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
9200: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
9210: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20  ar *keyfile.    
9220: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9230: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20  char *certfile. 
9240: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9250: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9260: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a   *key  .= NULL;.
9270: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20      int key_len 
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
92a0: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20  d char *cert    
92b0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
92c0: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20   int cert_len   
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
92e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
92f0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
9300: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  LL;.    char *ci
9310: 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20  phersuites.     
9320: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
9330: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20  har *CAfile.    
9340: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9350: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20  char *CAdir..   
9360: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9370: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09   char *DHparams.
9380: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9390: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09      char *model.
93a0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
93b0: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
93c0: 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20  rname.        = 
93d0: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
93e0: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
93f0: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
9400: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
9410: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
9420: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  _id = NULL;.    
9430: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d  Tcl_Obj *alpn..=
9440: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
9450: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
9460: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
9470: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
9480: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
9490: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
94a0: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65   proto = 0, leve
94b0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  l = -1;.    int 
94c0: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75  verify = 0, requ
94d0: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74  ire = 0, request
94e0: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73   = 1, post_hands
94f0: 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64  hake = 0;..    d
9500: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
9510: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  ;..#if defined(N
9520: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
9530: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9540: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30  S1).    tls1 = 0
9550: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9560: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
9570: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9580: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
9590: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65    tls1_1 = 0;.#e
95a0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
95b0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
95c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
95d0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c  O_TLS1_2).    tl
95e0: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_2 = 0;.#endif
95f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9600: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
9610: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9620: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33  S1_3).    tls1_3
9630: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
9640: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
9650: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
9660: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
9670: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f  bjv, "channel ?o
9680: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ptions?");..retu
9690: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
96a0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
96b0: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
96c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
96d0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
96e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
96f0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
9700: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
9710: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9720: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9730: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9740: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
9750: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
9760: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
9770: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
9780: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9790: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
97a0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
97b0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
97c0: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
97d0: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
97e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
97f0: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b  bjv[idx], NULL);
9800: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
9810: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
9820: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
9830: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
9840: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64  TR("-cadir", CAd
9850: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  ir);..OPTSTR("-c
9860: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
9870: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74  ..OPTBYTE("-cert
9880: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65  ", cert, cert_le
9890: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65  n);..OPTSTR("-ce
98a0: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c  rtfile", certfil
98b0: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  e);..OPTSTR("-ci
98c0: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b  pher", ciphers);
98d0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
98e0: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  rs", ciphers);..
98f0: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9900: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75  uites", ciphersu
9910: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  ites);..OPTOBJ("
9920: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
9930: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
9940: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
9950: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b  s);..OPTBYTE("-k
9960: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  ey", key, key_le
9970: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  n);..OPTSTR("-ke
9980: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
9990: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
99a0: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
99b0: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
99c0: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
99d0: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64  BOOL("-post_hand
99e0: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e  shake", post_han
99f0: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f  dshake);..OPTBOO
9a00: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  L("-request", re
9a10: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
9a20: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
9a30: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22  uire);..OPTINT("
9a40: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c  -securitylevel",
9a50: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9a60: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9a70: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9a80: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9a90: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9aa0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9ab0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9ac0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9ad0: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9ae0: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9af0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9b00: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9b10: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9b20: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9b30: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9b40: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9b50: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9b60: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9b70: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9b80: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9b90: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9ba0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9bb0: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9bc0: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
9bd0: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
9be0: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
9bf0: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
9c00: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
9c10: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
9c20: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
9c30: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
9c40: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
9c50: 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73  ecuritylevel, -s
9c60: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
9c70: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
9c80: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
9c90: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
9ca0: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
9cb0: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
9cc0: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
9cd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9ce0: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
9cf0: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53  t)..verify |= SS
9d00: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
9d10: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
9d20: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
9d30: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
9d40: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  re).verify |= SS
9d50: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
9d60: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
9d70: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
9d80: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
9d90: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ).verify |= SSL_
9da0: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
9db0: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
9dc0: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72  erify == 0)..ver
9dd0: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
9de0: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
9df0: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
9e00: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
9e10: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9e20: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
9e30: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
9e40: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
9e50: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
9e60: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9e70: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
9e80: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
9e90: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9ea0: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
9eb0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
9ec0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9ed0: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
9ee0: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
9ef0: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
9f00: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
9f10: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
9f20: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
9f30: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
9f40: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
9f50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9f60: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
9f70: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
9f80: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9f90: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
9fa0: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
9fb0: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
9fc0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
9fd0: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
9fe0: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
9ff0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a000: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
a010: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
a020: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
a030: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a040: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
a050: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
a060: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
a070: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a080: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
a090: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
a0a0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
a0b0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
a0c0: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
a0d0: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
a0e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a0f0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a100: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a110: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a120: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a130: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a140: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a150: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a160: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a170: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a180: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a190: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a1a0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a1b0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a1c0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a1d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a1e0: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a1f0: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a200: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a210: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a220: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a230: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a240: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a250: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a260: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a270: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a280: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a290: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a2a0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a2b0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a2c0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a2d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a2e0: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a2f0: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a300: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a310: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a320: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a330: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a340: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a350: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a360: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a370: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a380: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a390: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a3a0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a3b0: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a3c0: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a3d0: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a3e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a3f0: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a400: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a410: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a420: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a430: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a440: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a450: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a460: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a470: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a480: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a490: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a4a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a4b0: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a4c0: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a4d0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a4e0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a4f0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a500: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a520: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
a530: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
a540: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
a550: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
a560: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
a570: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
a580: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
a590: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
a5a0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
a5b0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a5c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a5d0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
a5e0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
a5f0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
a600: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
a610: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
a620: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a630: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a640: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a650: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
a660: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
a670: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a680: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a690: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a6a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a6b0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a6c0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a6d0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a6e0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a6f0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a700: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a710: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a720: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a730: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a740: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
a750: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69    cert_len, CAdi
a760: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  r, CAfile, ciphe
a770: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
a780: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
a790: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
a7a0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a7b0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a7c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a7d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
a7e0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a7f0: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20  ctx = ctx;..    
a800: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
a810: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
a820: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hat the channel 
a830: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20  works in binary 
a840: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20  (for the.     * 
a850: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74  encryption not t
a860: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29  o get goofed up)
a870: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  ..     * We only
a880: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20   want to adjust 
a890: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e  the buffering in
a8a0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73   pre-v2 channels
a8b0: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65  , where.     * e
a8c0: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74  ach channel in t
a8d0: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69  he stack maintai
a8e0: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66  ned its own buff
a8f0: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ers..     */.   
a900: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a910: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
a920: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
a930: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
a940: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
a950: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
a960: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
a970: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
a980: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
a990: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
a9a0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
a9b0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
a9c0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
a9d0: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
a9e0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
a9f0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
aa00: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
aa10: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
aa20: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
aa30: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
aa40: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
aa50: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
aa60: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
aa70: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
aa80: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
aa90: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
aaa0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
aab0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
aac0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
aad0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
aae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
aaf0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ab00: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
ab10: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
ab20: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
ab30: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ab40: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
ab50: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
ab60: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
ab70: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
ab80: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
ab90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
aba0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
abb0: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
abc0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
abd0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
abe0: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
abf0: 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43  a) statePtr, (TC
ac00: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
ac10: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
ac20: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
ac30: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20  Created channel 
ac40: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47  named %s", Tcl_G
ac50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
ac60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
ac70: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
ac80: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
ac90: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
aca0: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f  ./*.. * No use o
acb0: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79  f Tcl_Eventually
acc0: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20  Free because no 
acd0: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65  possible Tcl_Pre
ace0: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73  serve... */..Tls
acf0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
ad00: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
ad10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ad20: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
ad30: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ad40: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
ad50: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
ad60: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
ad70: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
ad80: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
ad90: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ada0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
adb0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
adc0: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
add0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
ade0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
adf0: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
ae00: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ae10: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ae20: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
ae30: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
ae40: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
ae50: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
ae60: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
ae70: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ae80: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
ae90: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
aea0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
aeb0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
aec0: 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a  king));..    /*.
aed0: 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69       * SSL Initi
aee0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a  alization.     *
aef0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
af00: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74  ssl = SSL_new(st
af10: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
af20: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d    if (!statePtr-
af30: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20  >ssl) {../* SSL 
af40: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f  library error */
af50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
af60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
af70: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73  dn't construct s
af80: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52  sl session: ", R
af90: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
afa0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
afb0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
afc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
afd0: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
afe0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
aff0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
b000: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b010: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
b020: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b030: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
b040: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
b050: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
b060: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
b070: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
b080: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
b090: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
b0a0: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
b0b0: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
b0c0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
b0d0: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
b0e0: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33  g, though RFC 43
b0f0: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a  66 says UTF-8. *
b100: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f  /..if (!SSL_set_
b110: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65  tlsext_host_name
b120: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b130: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72  servername) && r
b140: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54  equire) {..    T
b150: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b160: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
b170: 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65   TLS host name e
b180: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22  xtension failed"
b190: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b1a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b1b0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b1c0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b1d0: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22   "SNI", "FAILED"
b1e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b1f0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
b200: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
b210: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
b220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
b230: 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20  /* Set hostname 
b240: 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69  for peer certifi
b250: 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65  cate hostname ve
b260: 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c  rification in cl
b270: 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74  ients...   Don't
b280: 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f   use SSL_set1_ho
b290: 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20  st since it has 
b2a0: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a  limitations. */.
b2b0: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68  .if (!SSL_add1_h
b2c0: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ost(statePtr->ss
b2d0: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20  l, servername)) 
b2e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b2f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b300: 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73  "setting DNS hos
b310: 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20  t name failed", 
b320: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b330: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
b340: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
b350: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
b360: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c  HOSTNAME", "FAIL
b370: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b380: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
b390: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b3a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b3b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b3c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
b3d0: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64  esume session id
b3e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73   */.    if (sess
b3f0: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e  ion_id && strlen
b400: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20  (session_id) <= 
b410: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f  SSL_MAX_SID_CTX_
b420: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53  LENGTH) {../* SS
b430: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20  L_set_session() 
b440: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53  */..if (!SSL_SES
b450: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e  SION_set1_id_con
b460: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73  text(SSL_get_ses
b470: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
b480: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  sl), session_id,
b490: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
b4a0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b4b0: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  d))) {..    Tcl_
b4c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b4d0: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73  erp, "Resume ses
b4e0: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69  sion id ", sessi
b4f0: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22  on_id, " failed"
b500: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b510: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b520: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b530: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b540: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49   "SESSION", "FAI
b550: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b560: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
b570: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b580: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20   *) statePtr);. 
b590: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
b5a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b5b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
b5c0: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e  able Application
b5d0: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20  -Layer Protocol 
b5e0: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61  Negotiation. Exa
b5f0: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f  mples are: http/
b600: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20  1.0,..http/1.1, 
b610: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61  h2, h3, ftp, ima
b620: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c  p, pop3, xmpp-cl
b630: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65  ient, xmpp-serve
b640: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74  r, mqtt, irc, et
b650: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c  c. */.    if (al
b660: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72  pn) {../* Conver
b670: 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74  t a TCL list int
b680: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  o a protocol-lis
b690: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74  t in wire-format
b6a0: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   */..unsigned ch
b6b0: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a  ar *protos, *p;.
b6c0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72  .unsigned int pr
b6d0: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69  otos_len = 0;..i
b6e0: 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a  nt i, len, cnt;.
b6f0: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b  .Tcl_Obj **list;
b700: 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
b710: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
b720: 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74  terp, alpn, &cnt
b730: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f  , &list) != TCL_
b740: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  OK) {..    Tls_F
b750: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b760: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b770: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b780: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
b790: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
b7a0: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
b7b0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
b7c0: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
b7d0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
b7e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
b7f0: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
b800: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
b810: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
b820: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b830: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
b840: 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f  ocol name too lo
b850: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ng", (char *) NU
b860: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
b870: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b880: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b890: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
b8a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
b8b0: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63  );...Tls_Free((c
b8c0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b8d0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
b8e0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
b8f0: 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20    protos_len += 
b900: 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a  1 + len;..}.../*
b910: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c   Build the compl
b920: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ete protocol-lis
b930: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63  t */..protos = c
b940: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65  kalloc(protos_le
b950: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c  n);../* protocol
b960: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f  -lists consist o
b970: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70  f 8-bit length-p
b980: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74  refixed, byte st
b990: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69  rings */..for (i
b9a0: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73   = 0, p = protos
b9b0: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
b9c0: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72  {..    char *str
b9d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
b9e0: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c  FromObj(list[i],
b9f0: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b   &len);..    *p+
ba00: 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65  + = len;..    me
ba10: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e  mcpy(p, str, len
ba20: 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e  );..    p += len
ba30: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65  ;..}.../* SSL_se
ba40: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61  t_alpn_protos ma
ba50: 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  kes a copy of th
ba60: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
ba70: 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69  */../* Note: Thi
ba80: 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65  s functions reve
ba90: 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20  rses the return 
baa0: 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e  value convention
bab0: 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74   */..if (SSL_set
bac0: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61  _alpn_protos(sta
bad0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74  tePtr->ssl, prot
bae0: 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29  os, protos_len))
baf0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
bb00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bb10: 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20   "failed to set 
bb20: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c  ALPN protocols",
bb30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
bb40: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
bb50: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
bb60: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
bb70: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22  "ALPN", "FAILED"
bb80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bb90: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
bba0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
bbb0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28  r);..    ckfree(
bbc0: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65  protos);..    re
bbd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bbe0: 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72  .}.../* Store pr
bbf0: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a  otocols list */.
bc00: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
bc10: 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61  s = protos;..sta
bc20: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
bc30: 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a  n = protos_len;.
bc40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74      } else {..st
bc50: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
bc60: 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72   NULL;..statePtr
bc70: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  ->protos_len = 0
bc80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
bc90: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62       * SSL Callb
bca0: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20  acks.     */.   
bcb0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74   SSL_set_app_dat
bcc0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  a(statePtr->ssl,
bcd0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
bce0: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63  r);./* point bac
bcf0: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53  k to us */.    S
bd00: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74  SL_set_verify(st
bd10: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72  atePtr->ssl, ver
bd20: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62  ify, VerifyCallb
bd30: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65  ack);.    SSL_se
bd40: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28  t_info_callback(
bd50: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49  statePtr->ssl, I
bd60: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  nfoCallback);.. 
bd70: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
bd80: 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f  or observing pro
bd90: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a  tocol messages *
bda0: 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  /.#ifndef OPENSS
bdb0: 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20  L_NO_SSL_TRACE. 
bdc0: 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43     /* void SSL_C
bdd0: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  TX_set_msg_callb
bde0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
bdf0: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73  ->ctx, (void *)s
be00: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f  tatePtr);.    vo
be10: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  id SSL_CTX_set_m
be20: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  sg_callback(stat
be30: 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61  ePtr->ctx, Messa
be40: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a  geCallback); */.
be50: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
be60: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
be70: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69  tePtr->ssl, (voi
be80: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
be90: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63     SSL_set_msg_c
bea0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
beb0: 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61  ->ssl, MessageCa
bec0: 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  llback);.#endif.
bed0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54  .    /* Create T
bee0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48  cl_Channel BIO H
bef0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74  andler */.    st
bf00: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20  atePtr->p_bio.= 
bf10: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74  BIO_new_tcl(stat
bf20: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  ePtr, BIO_NOCLOS
bf30: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  E);.    statePtr
bf40: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28  ->bio.= BIO_new(
bf50: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20  BIO_f_ssl());.. 
bf60: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b     if (server) {
bf70: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c  ../* Server call
bf80: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54  backs */..SSL_CT
bf90: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
bfa0: 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74  vername_arg(stat
bfb0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64  ePtr->ctx, (void
bfc0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53   *)statePtr);..S
bfd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
bfe0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c  t_servername_cal
bff0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c000: 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b  ctx, SNICallback
c010: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c020: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28  client_hello_cb(
c030: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48  statePtr->ctx, H
c040: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  elloCallback, (v
c050: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c060: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c070: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
c080: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
c090: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63  et_alpn_select_c
c0a0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c0b0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28   ALPNCallback, (
c0c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c0d0: 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  ;.#ifdef USE_NPN
c0e0: 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32  ..    if (tls1_2
c0f0: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
c100: 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54  == 0) {...SSL_CT
c110: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  X_set_next_proto
c120: 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28  s_advertised_cb(
c130: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e  statePtr->ctx, N
c140: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c150: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c160: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a      }.#endif..}.
c170: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76  ../* Enable serv
c180: 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20  er to send cert 
c190: 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61  request after ha
c1a0: 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33  ndshake (TLS 1.3
c1b0: 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20   only) */../* A 
c1c0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
c1d0: 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20  must take place 
c1e0: 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63  for the Certific
c1f0: 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62  ate Request to b
c200: 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68  e..   sent to th
c210: 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63  e client, this c
c220: 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20  an be done with 
c230: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65  SSL_do_handshake
c240: 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75  (). */..if (requ
c250: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64  est && post_hand
c260: 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29  shake && tls1_3)
c270: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69   {..    SSL_veri
c280: 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68  fy_client_post_h
c290: 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74  andshake(statePt
c2a0: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a  r->ssl);..}.../*
c2b0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63   set automatic c
c2c0: 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a  urve selection *
c2d0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f  /..SSL_set_ecdh_
c2e0: 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73  auto(statePtr->s
c2f0: 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74  sl, 1);.../* Set
c300: 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a   server mode */.
c310: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
c320: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56   |= TLS_TCL_SERV
c330: 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63  ER;..SSL_set_acc
c340: 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50  ept_state(stateP
c350: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
c360: 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e  else {../* Clien
c370: 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23  t callbacks */.#
c380: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69  ifdef USE_NPN..i
c390: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c3a0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74  tos != NULL && t
c3b0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c3c0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20  s1_3 == 0) {..  
c3d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65    SSL_CTX_set_ne
c3e0: 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f  xt_proto_select_
c3f0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c400: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
c410: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c420: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f  );..}.#endif.../
c430: 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e  * Session cachin
c440: 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  g */..SSL_CTX_se
c450: 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f  t_session_cache_
c460: 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63  mode(statePtr->c
c470: 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  tx, SSL_SESS_CAC
c480: 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f  HE_CLIENT | SSL_
c490: 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e  SESS_CACHE_NO_IN
c4a0: 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09  TERNAL_STORE);..
c4b0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
c4c0: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72  _new_cb(statePtr
c4d0: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61  ->ctx, SessionCa
c4e0: 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e  llback);.../* En
c4f0: 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68  able post handsh
c500: 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69  ake Authenticati
c510: 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c  on extension. TL
c520: 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20  S 1.3 only, not 
c530: 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28  http/2. */..if (
c540: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
c550: 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20  handshake) {..  
c560: 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68    SSL_set_post_h
c570: 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74  andshake_auth(st
c580: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c590: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69  ..}.../* Set cli
c5a0: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c  ent mode */..SSL
c5b0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61  _set_connect_sta
c5c0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c5d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  );.    }.    SSL
c5e0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
c5f0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
c600: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
c610: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
c620: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
c630: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
c640: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
c650: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  LOSE);..    /*. 
c660: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c      * End of SSL
c670: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20   Init.     */.  
c680: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
c690: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65  ning %s", Tcl_Ge
c6a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
c6b0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
c6c0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
c6d0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
c6e0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
c6f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
c700: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  elf), TCL_VOLATI
c710: 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  LE);..    return
c720: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
c730: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
c740: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c790: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62   *. * UnimportOb
c7a0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
c7b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
c7c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76  invoked to remov
c7d0: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  e the topmost ch
c7e0: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a  annel filter.. *
c7f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
c800: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
c810: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
c820: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
c830: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68  y modify the beh
c840: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63  avior of an IO c
c850: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
c8b0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  UnimportObjCmd(C
c8c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
c8d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
c8e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
c8f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
c900: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
c910: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
c920: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
c930: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
c940: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72   on. */..    dpr
c950: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
c960: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
c970: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
c980: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c990: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
c9a0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
c9b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
c9c0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
c9d0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
c9e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c9f0: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
ca00: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
ca10: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
ca20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
ca30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
ca40: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
ca50: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
ca60: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
ca70: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
ca80: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
ca90: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69  el(chan);..    i
caa0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
cab0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
cac0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
cad0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
cae0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
caf0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
cb00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cb10: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
cb20: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
cb30: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  el", NULL);..   
cb40: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
cb50: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
cb60: 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48   "UNIMPORT", "CH
cb70: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
cb80: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
cb90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
cba0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
cbb0: 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b   if (Tcl_Unstack
cbc0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
cbd0: 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52  chan) == TCL_ERR
cbe0: 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OR) {..return TC
cbf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cc00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
cc10: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
cc20: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
cc30: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
cc80: 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73  CTX_Init -- cons
cc90: 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20  truct a SSL_CTX 
cca0: 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52  instance. *. * R
ccb0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c  esults:. *.A val
ccc0: 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61  id SSL_CTX insta
ccd0: 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a  nce or NULL.. *.
cce0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
ccf0: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53  . *.constructs S
cd00: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
cd10: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
cd60: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43  atic SSL_CTX *.C
cd70: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
cd80: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
cd90: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
cda0: 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c  , char *keyfile,
cdb0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c   char *certfile,
cdc0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
cdd0: 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65  ar *key, unsigne
cde0: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e  d char *cert, in
cdf0: 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63  t key_len, int c
ce00: 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43  ert_len, char *C
ce10: 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a  Adir,.    char *
ce20: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69  CAfile, char *ci
ce30: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70  phers, char *cip
ce40: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c  hersuites, int l
ce50: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61  evel, char *DHpa
ce60: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f  rams) {.    Tcl_
ce70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
ce80: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
ce90: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
cea0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
ceb0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
cec0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
ced0: 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66  ds1;.    int off
cee0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f   = 0;.    int lo
cef0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a  ad_private_key;.
cf00: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45      const SSL_ME
cf10: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20  THOD *method;.. 
cf20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
cf30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21  ed");..    if (!
cf40: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70  proto) {..Tcl_Ap
cf50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
cf60: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f  p, "no valid pro
cf70: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c  tocol selected",
cf80: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
cf90: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
cfa0: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63   /* create SSL c
cfb0: 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50  ontext */.#if OP
cfc0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
cfd0: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30  MBER >= 0x101000
cfe0: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e  00L || defined(N
cff0: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e  O_SSL2) || defin
d000: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
d010: 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  L2).    if (ENAB
d020: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d030: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54  ROTO_SSL2)) {..T
d040: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d050: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72  interp, "SSL2 pr
d060: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d070: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
d080: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d090: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d0a0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c  ined(NO_SSL3) ||
d0b0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d0c0: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66  _NO_SSL3).    if
d0d0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d0e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
d0f0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d100: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
d110: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL3 protocol not
d120: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
d130: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d140: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d150: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
d160: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
d170: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
d180: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d190: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d1a0: 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41  _TLS1)) {..Tcl_A
d1b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d1c0: 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f  rp, "TLS 1.0 pro
d1d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d1e0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
d1f0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d200: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d210: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
d220: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d230: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
d240: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d250: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d260: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
d270: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d280: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
d290: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d2a0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
d2b0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d2c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d2d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
d2e0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d2f0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20  _NO_TLS1_2).    
d300: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d310: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
d320: 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_2)) {..Tcl_App
d330: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d340: 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f  , "TLS 1.2 proto
d350: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d360: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
d370: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d380: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d390: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
d3a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d3b0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
d3c0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d3d0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
d3e0: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _3)) {..Tcl_Appe
d3f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d400: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63   "TLS 1.3 protoc
d410: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d420: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
d430: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d440: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f  ndif.    if (pro
d450: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55  to == 0) {../* U
d460: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f  se full range */
d470: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
d480: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
d490: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54  ctx, 0);..SSL_CT
d4a0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
d4b0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d4c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
d4d0: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
d4e0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
d4f0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
d500: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
d510: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
d520: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d530: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
d540: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
d550: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d560: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
d570: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
d580: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
d590: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d5a0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d5b0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
d5c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d5d0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
d5e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
d5f0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
d600: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
d610: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
d620: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
d630: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d640: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
d650: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d660: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d670: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
d680: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d690: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
d6a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d6b0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
d6c0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d6d0: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
d6e0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
d6f0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
d700: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
d710: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d720: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d730: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d740: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d750: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
d760: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d770: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
d780: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
d790: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
d7a0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d7b0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
d7c0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d7d0: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
d7e0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d7f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d800: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d810: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d820: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
d830: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d840: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
d850: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
d860: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
d870: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d880: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
d890: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
d8a0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
d8b0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d8c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d8d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
d8e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d8f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
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 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
d920: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
d930: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
d940: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
d950: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
d960: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
d970: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
d980: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d990: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
d9a0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d9b0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
d9c0: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
d9d0: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
d9e0: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
d9f0: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
da00: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
da10: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
da20: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
da30: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
da40: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
da50: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
da60: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
da70: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
da80: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
da90: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
daa0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
dab0: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
dac0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
dad0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
dae0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
daf0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
db00: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
db10: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
db20: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
db30: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
db40: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
db50: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
db60: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
db70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
db80: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
db90: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dba0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
dbb0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
dbc0: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
dbd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dbe0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
dbf0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc00: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
dc10: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dc20: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
dc30: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
dc40: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
dc50: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
dc60: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
dc70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dc80: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
dc90: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
dca0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
dcb0: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
dcc0: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
dcd0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
dce0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
dcf0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
dd00: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
dd10: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
dd20: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
dd30: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
dd40: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
dd50: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
dd60: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
dd70: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
dd80: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
dd90: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
dda0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
ddb0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20  turn(NULL);.    
ddc0: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e  }..    if (geten
ddd0: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
dde0: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
ddf0: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b  _keylog_callback
de00: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c  (ctx, KeyLogCall
de10: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  back);.    }..#i
de20: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
de30: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
de40: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
de50: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
de60: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
de70: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43  TLS1_3) {..SSL_C
de80: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
de90: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
dea0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
deb0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
dec0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
ded0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
dee0: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
def0: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63  ..    /* Force c
df00: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20  ipher selection 
df10: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20  order by server 
df20: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  */.    if (!isSe
df30: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
df40: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
df50: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
df60: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
df70: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53  E);.    }..    S
df80: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
df90: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
dfa0: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
dfb0: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
dfc0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
dfd0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
dfe0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
dff0: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
e000: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
e010: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e020: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
e030: 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49  _OP_NO_COMPRESSI
e040: 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20  ON);./* disable 
e050: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e  compression even
e060: 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   if supported */
e070: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e080: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
e090: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
e0a0: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
e0b0: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  s */.#if OPENSSL
e0c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e0d0: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20  < 0x10101000L.  
e0e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f    SSL_CTX_set_mo
e0f0: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45  de(ctx, SSL_MODE
e100: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a  _AUTO_RETRY);./*
e110: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64   handle new hand
e120: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72  shakes in backgr
e130: 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61  ound. On by defa
e140: 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ult in OpenSSL 1
e150: 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  .1.1. */.#endif.
e160: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
e170: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
e180: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20  ctx, 128);..    
e190: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69  /* Set user defi
e1a0: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70  ned ciphers, cip
e1b0: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20  her suites, and 
e1c0: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
e1d0: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  /.    if ((ciphe
e1e0: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  rs != NULL) && !
e1f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
e200: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70  er_list(ctx, cip
e210: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  hers)) {..Tcl_Ap
e220: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e230: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20  p, "Set ciphers 
e240: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
e250: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
e260: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e270: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e280: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e290: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
e2a0: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
e2b0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e2c0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
e2d0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
e2e0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
e2f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e300: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
e310: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e320: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e330: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e340: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e350: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e360: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
e370: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e380: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
e390: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
e3a0: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
e3b0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e3c0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
e3d0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
e3e0: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
e3f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
e400: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
e410: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e420: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e430: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
e440: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
e450: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e460: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
e470: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
e480: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
e490: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
e4a0: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
e4b0: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
e4c0: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
e4d0: 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f   one */.#ifdef O
e4e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
e4f0: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
e500: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
e510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e520: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
e530: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
e540: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
e550: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
e560: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
e570: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e580: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48  .#else.    {..DH
e590: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72  * dh;..if (DHpar
e5a0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
e5b0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20      BIO *bio;.. 
e5c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
e5d0: 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69  it(&ds);..    bi
e5e0: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65  o = BIO_new_file
e5f0: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26  (F2N(DHparams, &
e600: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20  ds), "r");..    
e610: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63  if (!bio) {...Tc
e620: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e630: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  s);...Tcl_Append
e640: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e650: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44  Could not find D
e660: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  H parameters fil
e670: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
e680: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e690: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e6a0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a  n NULL;..    }..
e6b0: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65  .    dh = PEM_re
e6c0: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28  ad_bio_DHparams(
e6d0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  bio, NULL, NULL,
e6e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f   NULL);..    BIO
e6f0: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20  _free(bio);..   
e700: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
e710: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28  (&ds);..    if (
e720: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  !dh) {...Tcl_App
e730: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e740: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "Could not rea
e750: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
e760: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61  from file", (cha
e770: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
e780: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e790: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
e7a0: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b  .    }..} else {
e7b0: 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64  ..    dh = get_d
e7c0: 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53  hParams();..}..S
e7d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64  SL_CTX_set_tmp_d
e7e0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f  h(ctx, dh);..DH_
e7f0: 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a  free(dh);.    }.
e800: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73  #endif..    /* s
e810: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61  et our certifica
e820: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70  te */.    load_p
e830: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a  rivate_key = 0;.
e840: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
e850: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
e860: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
e870: 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  1;...Tcl_DString
e880: 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20  Init(&ds);...if 
e890: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
e8a0: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
e8b0: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c  x, F2N(certfile,
e8c0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
e8d0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
e8e0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e8f0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e900: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e910: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
e920: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
e930: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
e940: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09  tfile, ": ",....
e950: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
e960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e970: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
e980: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
e990: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
e9a0: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
e9b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
e9c0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
e9d0: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
e9e0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
e9f0: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65  SN1(ctx, cert_le
ea00: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
ea10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
ea20: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
ea30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ea40: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
ea50: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
ea60: 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20  cate: ",....    
ea70: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
ea80: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
ea90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
eaa0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
eab0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
eac0: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
ead0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
eae0: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
eaf0: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
eb00: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
eb10: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
eb20: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
eb30: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
eb40: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
eb50: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
eb60: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
eb70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
eb80: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
eb90: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
eba0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
ebb0: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20  file, ": ",.... 
ebc0: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
ebd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ebe0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
ebf0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
ec00: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09  n NULL;.#endif..
ec10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ec20: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20  set our private 
ec30: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  key */.    if (l
ec40: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29  oad_private_key)
ec50: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20   {..if (keyfile 
ec60: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d  == NULL && key =
ec70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b  = NULL) {..    k
ec80: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
ec90: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66  e;..}...if (keyf
eca0: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
ecb0: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70      /* get the p
ecc0: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63  rivate key assoc
ecd0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
ece0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
ecf0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
ed00: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79  == NULL) {...key
ed10: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
ed20: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
ed30: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
ed40: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74  ivateKey_file(ct
ed50: 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20  x, F2N(keyfile, 
ed60: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59  &ds), SSL_FILETY
ed70: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
ed80: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
ed90: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
eda0: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
edb0: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
edc0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
edd0: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
ede0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
edf0: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
ee00: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
ee10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
ee20: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
ee30: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b  ic key file ", k
ee40: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09  eyfile, " ",....
ee50: 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28           REASON(
ee60: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
ee70: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
ee80: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
ee90: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
eea0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
eeb0: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
eec0: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
eed0: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
eee0: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
eef0: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
ef00: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
ef10: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
ef20: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
ef30: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
ef40: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
ef50: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
ef60: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
ef70: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
ef80: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ef90: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
efa0: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
efb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
efc0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
efd0: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41  blic key: ", REA
efe0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
eff0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f000: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f010: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f020: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
f030: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
f040: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
f050: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
f060: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
f070: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
f080: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
f090: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
f0a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f0b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
f0c0: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
f0d0: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
f0e0: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
f0f0: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
f100: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
f110: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
f120: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
f130: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
f140: 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69  .    /* Set veri
f150: 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a  fication CAs */.
f160: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
f170: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63  nit(&ds);.    Tc
f180: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
f190: 73 31 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72  s1);.    /* Ther
f1a0: 65 20 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74  e is one default
f1b0: 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20   directory, one 
f1c0: 64 65 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e  default file, an
f1d0: 64 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74  d one default st
f1e0: 6f 72 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c  ore...The defaul
f1f0: 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  t CA certificate
f200: 73 20 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64  s directory (and
f210: 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20   default store) 
f220: 69 73 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53  is in the OpenSS
f230: 4c 0a 09 63 65 72 74 73 20 64 69 72 65 63 74 6f  L..certs directo
f240: 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76  ry. It can be ov
f250: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
f260: 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76  SSL_CERT_DIR env
f270: 20 76 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75   var. The..defau
f280: 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74  lt CA certificat
f290: 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65  es file is calle
f2a0: 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68  d cert.pem in th
f2b0: 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53  e default OpenSS
f2c0: 4c 0a 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74  L..directory. It
f2d0: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
f2e0: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
f2f0: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e  RT_FILE env var.
f300: 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f   */../* int SSL_
f310: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
f320: 76 65 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43  verify_dir(SSL_C
f330: 54 58 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74  TX *ctx) and int
f340: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
f350: 61 75 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65  ault_verify_file
f360: 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a  (SSL_CTX *ctx) *
f370: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
f380: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
f390: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
f3a0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
f3b0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29  F2N(CAdir, &ds1)
f3c0: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73  ) ||..!SSL_CTX_s
f3d0: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
f3e0: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a  y_paths(ctx)) {.
f3f0: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69  #if 0..Tcl_DStri
f400: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63  ngFree(&ds);..Tc
f410: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f420: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63  s1);../* Don't c
f430: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66  urrently care if
f440: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09   this fails */..
f450: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f460: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65  (interp, "SSL de
f470: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74  fault verify pat
f480: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  hs: ", REASON(),
f490: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f4a0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f4b0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
f4c0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  L;.#endif.    }.
f4d0: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f  .    /* https://
f4e0: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
f4f0: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a  p/tls/bugs/57/ *
f500: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  /.    /* XXX:TOD
f510: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
f520: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
f530: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
f540: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
f550: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
f560: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20  ystem */.    if 
f570: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  (CAfile != NULL)
f580: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30   {..STACK_OF(X50
f590: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
f5a0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
f5b0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
f5c0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
f5d0: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21  .if (certNames !
f5e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
f5f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
f600: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
f610: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20  ertNames);..}.  
f620: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
f630: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20  ringFree(&ds);. 
f640: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f650: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65  ee(&ds1);.    re
f660: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a  turn ctx;.}.../*
f670: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61  ------. *. * Sta
f6c0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  tusObjCmd -- ret
f6d0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20  urn certificate 
f6e0: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65  for connected pe
f6f0: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
f700: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
f710: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
f720: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
f730: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
f740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
f790: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43  t.StatusObjCmd(C
f7a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
f7b0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
f7c0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
f7d0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
f7e0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
f7f0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
f800: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72  ;.    X509 *peer
f810: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
f820: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43  bjPtr;.    Tcl_C
f830: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
f840: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61   char *channelNa
f850: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20  me, *ciphers;.  
f860: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
f870: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f880: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
f890: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
f8a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a  ;.    int nid;..
f8b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
f8c0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74  led");..    swit
f8d0: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73  ch (objc) {..cas
f8e0: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65  e 2:..    channe
f8f0: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
f900: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f910: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  v[1], NULL);..  
f920: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
f930: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72  3:..    if (!str
f940: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69  cmp (Tcl_GetStri
f950: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d  ng (objv[1]), "-
f960: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61  local")) {...cha
f970: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  nnelName = Tcl_G
f980: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f990: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a  objv[2], NULL);.
f9a0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a  ..break;..    }.
f9b0: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c  .    /* else fal
f9c0: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f  l-through ... */
f9d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47  .#if defined(__G
f9e0: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74  NUC__)..    __at
f9f0: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74  tribute__((fallt
fa00: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66  hrough));.#endif
fa10: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20  ..default:..    
fa20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fa30: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
fa40: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
fa50: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75  nel");..    retu
fa60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fa70: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
fa80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
fa90: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61  nterp, channelNa
faa0: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20  me, &mode);.    
fab0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
fac0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
fad0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
fae0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ROR;.    }.    /
faf0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
fb00: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
fb10: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
fb20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
fb30: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
fb40: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
fb50: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
fb60: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
fb70: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
fb80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fb90: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
fba0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
fbb0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
fbc0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
fbd0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
fbe0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
fbf0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
fc00: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c  "TLS", "STATUS",
fc10: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
fc20: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
fc30: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
fc40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fc50: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
fc60: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
fc70: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
fc80: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
fc90: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
fca0: 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73  te for peer or s
fcb0: 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  elf */.    if (o
fcc0: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
fcd0: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
fce0: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
fcf0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fd00: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
fd10: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
fd20: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
fd30: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
fd40: 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74  /* Get X509 cert
fd50: 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a  ificate info */.
fd60: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
fd70: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
fd80: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
fd90: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
fda0: 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58  c == 2) {..    X
fdb0: 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a  509_free(peer);.
fdc0: 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c  .    peer = NULL
fdd0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
fde0: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
fdf0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
fe00: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
fe10: 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 68 61  /* Peer cert cha
fe20: 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c 79 29  in (client only)
fe30: 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46   */.    STACK_OF
fe40: 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 72 74  (X509)* ssl_cert
fe50: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  s = SSL_get_peer
fe60: 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 61 74  _cert_chain(stat
fe70: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
fe80: 69 66 20 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d  if (ssl_certs ==
fe90: 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39   NULL || sk_X509
fea0: 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 20  _num(ssl_certs) 
feb0: 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74  == 0) {..Tcl_Set
fec0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
fed0: 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53  , "TLS", "STATUS
fee0: 22 2c 20 22 43 45 52 54 49 46 49 43 41 54 45 22  ", "CERTIFICATE"
fef0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ff00: 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  ;..Tcl_IncrRefCo
ff10: 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 09 54 63  unt(objPtr);..Tc
ff20: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_DecrRefCount(o
ff30: 62 6a 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  bjPtr);..return 
ff40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ff50: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
ff60: 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69  me */.    Tcl_Li
ff70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ff80: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ff90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ffa0: 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c 20  Obj("peername", 
ffb0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
ffc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ffd0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ffe0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
fff0: 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65 65  Obj(SSL_get0_pee
10000 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  rname(statePtr->
10010 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  ssl), -1));..   
10020 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10030 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10040 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10050 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 74  wStringObj("sbit
10060 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  s", -1));.    Tc
10070 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10080 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10090 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  bjPtr, Tcl_NewIn
100a0 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70  tObj(SSL_get_cip
100b0 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74  her_bits(statePt
100c0 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b  r->ssl, NULL)));
100d0 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20  ..    ciphers = 
100e0 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63  (char*)SSL_get_c
100f0 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
10100 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 63  ssl);.    if ((c
10110 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20  iphers != NULL) 
10120 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 65  && (strcmp(ciphe
10130 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d  rs, "(NONE)") !=
10140 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74   0)) {..Tcl_List
10150 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10160 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10170 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10180 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29  j("cipher", -1))
10190 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
101a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
101b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
101c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 69 70  NewStringObj(cip
101d0 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20 20 20 20  hers, -1));.    
101e0 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  }..    /* Verify
101f0 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
10200 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
10210 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
10220 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10230 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10240 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10250 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
10260 72 69 66 79 52 65 73 75 6c 74 22 2c 20 2d 31 29  rifyResult", -1)
10270 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
10280 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10290 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a  interp, objPtr,.
102a0 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
102b0 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  j(X509_verify_ce
102c0 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
102d0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
102e0 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
102f0 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  ssl)), -1));..  
10300 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65    /* Verify mode
10310 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   */.    Tcl_List
10320 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10330 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10340 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10350 6a 28 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  j("verifyMode", 
10360 2d 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53 4c  -1));.    /* SSL
10370 5f 43 54 58 5f 67 65 74 5f 76 65 72 69 66 79 5f  _CTX_get_verify_
10380 6d 6f 64 65 28 63 74 78 29 20 2a 2f 0a 20 20 20  mode(ctx) */.   
10390 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f   mode = SSL_get_
103a0 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74  verify_mode(stat
103b0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
103c0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
103d0 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09  VERIFY_NONE) {..
103e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
103f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10400 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10410 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 6e 65 22  StringObj("none"
10420 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c  , -1));.    } el
10430 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c  se {..Tcl_Obj *l
10440 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  istObjPtr = Tcl_
10450 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
10460 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26  LL);..if (mode &
10470 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  & SSL_VERIFY_PEE
10480 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  R) {..    Tcl_Li
10490 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
104a0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
104b0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
104c0 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20  ringObj("peer", 
104d0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
104e0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
104f0 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
10500 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63  _CERT) {..    Tc
10510 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10520 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10530 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10540 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69  ewStringObj("fai
10550 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72  l if no peer cer
10560 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
10570 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10580 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
10590 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
105a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
105b0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
105c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
105d0 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f  ingObj("client o
105e0 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  nce", -1));..}..
105f0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10600 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
10610 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63  SHAKE) {..    Tc
10620 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10630 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10640 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10650 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73  ewStringObj("pos
10660 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31  t handshake", -1
10670 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
10680 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10690 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
106a0 20 6c 69 73 74 4f 62 6a 50 74 72 29 3b 0a 20 20   listObjPtr);.  
106b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69    }..    /* Veri
106c0 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f  fy mode depth */
106d0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
106e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
106f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10700 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10710 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 2d 31  verifyDepth", -1
10720 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53 4c 5f 43  ));.    /* SSL_C
10730 54 58 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65  TX_get_verify_de
10740 70 74 68 28 63 74 78 29 20 2a 2f 0a 20 20 20 20  pth(ctx) */.    
10750 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10760 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10770 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10780 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76  IntObj(SSL_get_v
10790 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74  erify_depth(stat
107a0 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 0a 20  ePtr->ssl)));.. 
107b0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
107c0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
107d0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
107e0 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
107f0 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
10800 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
10810 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10820 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
10830 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10840 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10850 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10860 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
10870 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
10880 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10890 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
108a0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
108b0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
108c0 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e  proto, (int) len
108d0 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
108e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
108f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10900 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10910 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31  j("protocol", -1
10920 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
10930 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10940 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10950 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10960 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  j(SSL_get_versio
10970 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
10980 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
10990 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53  Valid for non-RS
109a0 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20  A signature and 
109b0 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 54  TLS 1.3 */.    T
109c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
109d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
109e0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
109f0 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74  tringObj("signat
10a00 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
10a10 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20  ", -1));.    if 
10a20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c  (objc == 2 ? SSL
10a30 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
10a40 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
10a50 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53  ->ssl, &nid) : S
10a60 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
10a70 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10a80 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63  sl, &nid)) {..Tc
10a90 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10aa0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10ab0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10ac0 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32  ringObj(OBJ_nid2
10ad0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20  ln(nid), -1));. 
10ae0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
10af0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10b00 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10b10 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10b20 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b  ingObj("", -1));
10b30 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c  .    }.    Tcl_L
10b40 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10b50 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10b60 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10b70 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 54  gObj("signatureT
10b80 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ype", -1));.    
10b90 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20  if (objc == 2 ? 
10ba0 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
10bb0 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
10bc0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10bd0 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73  nid) : SSL_get_s
10be0 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
10bf0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10c00 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c   &nid)) {..Tcl_L
10c10 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10c20 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10c30 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10c40 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28  gObj(OBJ_nid2ln(
10c50 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  nid), -1));.    
10c60 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
10c70 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10c80 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10c90 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10ca0 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20  Obj("", -1));.  
10cb0 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
10cc0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10cd0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
10ce0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
10cf0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
10d00 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
10d10 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d50 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65  ----. *. * Conne
10d60 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20  ctionInfoObjCmd 
10d70 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63  -- return connec
10d80 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f  tion info from O
10d90 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
10da0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74  sults:. *.A list
10db0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   of connection i
10dc0 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nfo.  *. *------
10dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10e10 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f  /..static int Co
10e20 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
10e30 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
10e40 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
10e50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
10e60 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
10e70 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
10e80 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
10e90 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
10ea0 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
10eb0 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
10ec0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
10ed0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
10ee0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
10ef0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
10f00 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
10f10 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
10f20 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
10f30 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
10f40 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
10f50 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
10f60 69 6f 6e 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f  ion;.    long mo
10f70 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  de;..    if (obj
10f80 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
10f90 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10fa0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
10fb0 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
10fc0 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
10fd0 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
10fe0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
10ff0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
11000 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
11010 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
11020 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
11030 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
11040 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28  NULL) {..return(
11050 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
11060 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
11070 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
11080 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
11090 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
110a0 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
110b0 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
110c0 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
110d0 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
110e0 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
110f0 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
11100 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11110 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
11120 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
11130 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
11140 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
11150 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
11160 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
11170 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
11180 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20  , "CONNECTION", 
11190 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
111a0 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
111b0 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  ULL);..return(TC
111c0 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
111d0 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
111e0 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
111f0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  NULL);..    /* C
11200 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a  onnection info *
11210 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  /.    statePtr =
11220 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
11230 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
11240 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20  Data(chan);.    
11250 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  ssl = statePtr->
11260 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c  ssl;.    if (ssl
11270 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20   != NULL) {../* 
11280 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65  connection state
11290 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
112a0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
112b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
112c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
112d0 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54  state", -1));..T
112e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
112f0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11300 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11310 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61  tringObj(SSL_sta
11320 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
11330 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  sl), -1));.../* 
11340 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65  Get SNI requeste
11350 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  d server name */
11360 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11370 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11380 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11390 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72  ewStringObj("ser
113a0 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a  vername", -1));.
113b0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
113c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
113d0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
113e0 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67  wStringObj(SSL_g
113f0 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
11400 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
11410 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d  PE_host_name), -
11420 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72  1));.../* Get pr
11430 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c  otocol */..Tcl_L
11440 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11450 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11460 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11470 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c  gObj("protocol",
11480 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11490 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
114a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
114b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
114c0 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  j(SSL_get_versio
114d0 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09  n(ssl), -1));...
114e0 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e  /* Renegotiation
114f0 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c   allowed */..Tcl
11500 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11510 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11520 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11530 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69  ingObj("renegoti
11540 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  ation", -1));..T
11550 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11560 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11570 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11580 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53  tringObj(..    S
11590 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65  SL_get_secure_re
115a0 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70  negotiation_supp
115b0 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 75 70 70  ort(ssl) ? "supp
115c0 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75  orted" : "not su
115d0 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a  pported", -1));.
115e0 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74  ../* Get securit
115f0 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f  y level */..Tcl_
11600 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11610 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11620 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11630 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 74 79 6c  ngObj("securityl
11640 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63  evel", -1));..Tc
11650 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11660 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11670 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  bjPtr, Tcl_NewIn
11680 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63  tObj(SSL_get_sec
11690 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
116a0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
116b0 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69   info */..Tcl_Li
116c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
116d0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
116e0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
116f0 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75  Obj("session_reu
11700 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  sed", -1));..Tcl
11710 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11720 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11730 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  jPtr, Tcl_NewBoo
11740 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73  leanObj(SSL_sess
11750 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
11760 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65  );.../* Is serve
11770 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c  r info */..Tcl_L
11780 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11790 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
117a0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
117b0 67 4f 62 6a 28 22 69 73 5f 73 65 72 76 65 72 22  gObj("is_server"
117c0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
117d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
117e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
117f0 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
11800 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 65 72 76 65  Obj(SSL_is_serve
11810 72 28 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a  r(ssl)));.    }.
11820 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69  .    /* Cipher i
11830 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65  nfo */.    ciphe
11840 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  r = SSL_get_curr
11850 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b  ent_cipher(ssl);
11860 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20  .    if (cipher 
11870 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  != NULL) {..char
11880 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b   buf[BUFSIZ] = {
11890 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61  0};..int bits, a
118a0 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c  lg_bits;...Tcl_L
118b0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
118c0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
118d0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
118e0 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d  gObj("cipher", -
118f0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11900 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11910 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11920 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11930 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e  SSL_CIPHER_get_n
11940 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ame(cipher), -1)
11950 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11960 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11970 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11980 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
11990 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d  tandard_name", -
119a0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
119b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
119c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
119d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
119e0 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64  SSL_CIPHER_stand
119f0 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29  ard_name(cipher)
11a00 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d  , -1));...bits =
11a10 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
11a20 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c  bits(cipher, &al
11a30 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69  g_bits);..Tcl_Li
11a40 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11a50 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11a60 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11a70 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73  Obj("secret_bits
11a80 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
11a90 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11aa0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11ab0 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
11ac0 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69  (bits));..Tcl_Li
11ad0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11ae0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11af0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11b00 4f 62 6a 28 22 61 6c 67 6f 72 69 74 68 6d 5f 62  Obj("algorithm_b
11b10 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  its", -1));..Tcl
11b20 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11b30 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11b40 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
11b50 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a  Obj(alg_bits));.
11b60 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20  ./* alg_bits is 
11b70 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65  actual key secre
11b80 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62  t bits. If use b
11b90 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28  its and secret (
11ba0 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20  algorithm) bits 
11bb0 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20  differ,..   the 
11bc0 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73  rest of the bits
11bd0 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e   are fixed, i.e.
11be0 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70   for limited exp
11bf0 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74  ort ciphers (bit
11c00 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f  s < 56) */..Tcl_
11c10 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11c20 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11c30 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11c40 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69  ngObj("min_versi
11c50 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
11c60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11c70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11c80 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11c90 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52  ngObj(SSL_CIPHER
11ca0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70  _get_version(cip
11cb0 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a  her), -1));.../*
11cc0 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65   Get OpenSSL-spe
11cd0 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41  cific ID, not IA
11ce0 4e 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69  NA ID */..Tcl_Li
11cf0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11d00 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11d10 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11d20 4f 62 6a 28 22 69 64 22 2c 20 2d 31 29 29 3b 0a  Obj("id", -1));.
11d30 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11d40 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11d50 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11d60 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20 53 53  wIntObj((int) SS
11d70 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28  L_CIPHER_get_id(
11d80 63 69 70 68 65 72 29 29 29 3b 0a 0a 09 69 66 20  cipher)));...if 
11d90 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
11da0 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20  ription(cipher, 
11db0 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
11dc0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) != NULL) {..  
11dd0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11de0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11df0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11e00 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 73  ewStringObj("des
11e10 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  cription", -1));
11e20 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
11e30 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11e40 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11e50 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11e60 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20  buf, -1));..}.  
11e70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73    }..    /* Sess
11e80 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
11e90 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65  session = SSL_ge
11ea0 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a  t_session(ssl);.
11eb0 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20      if (session 
11ec0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73  != NULL) {..cons
11ed0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
11ee0 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74  *ticket;..size_t
11ef0 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64   len2;..unsigned
11f00 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73   int ulen;..cons
11f10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
11f20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72  *session_id, *pr
11f30 6f 74 6f 3b 0a 09 63 68 61 72 20 62 75 66 66 65  oto;..char buffe
11f40 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52  r[SSL_MAX_MASTER
11f50 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09  _KEY_LENGTH];...
11f60 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
11f70 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
11f80 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11f90 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74  he ALPN negotiat
11fa0 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  ion */..SSL_SESS
11fb0 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  ION_get0_alpn_se
11fc0 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20  lected(session, 
11fd0 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a  &proto, &len2);.
11fe0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11ff0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12000 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12010 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
12020 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12030 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12040 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12050 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12060 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74  Obj((char *)prot
12070 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b  o, (int) len2));
12080 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
12090 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
120a0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
120b0 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69  f the NPN negoti
120c0 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20  ation */.#ifdef 
120d0 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74  USE_NPN..SSL_get
120e0 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67  0_next_proto_neg
120f0 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72  otiated(ssl, &pr
12100 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63  oto, &ulen);..Tc
12110 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12120 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12130 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
12140 72 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20 2d  ringObj("npn", -
12150 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
12160 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12180 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12190 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
121a0 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65 6e  int) ulen));.#en
121b0 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62  dif.../* Resumab
121c0 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54  le session */..T
121d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
121e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
121f0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12200 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61  tringObj("resuma
12210 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ble", -1));..Tcl
12220 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12230 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12240 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
12250 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  Obj(SSL_SESSION_
12260 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73  is_resumable(ses
12270 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65  sion)));.../* Se
12280 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65  ssion start time
12290 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20   (seconds since 
122a0 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c  epoch) */..Tcl_L
122b0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
122c0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
122d0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
122e0 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65  gObj("start_time
122f0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12300 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12310 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12320 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  r, Tcl_NewLongOb
12330 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  j(SSL_SESSION_ge
12340 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29  t_time(session))
12350 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20  );.../* Timeout 
12360 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f  value - SSL_CTX_
12370 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20  get_timeout (in 
12380 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c  seconds) */..Tcl
12390 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
123a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
123b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
123c0 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22  ingObj("timeout"
123d0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
123e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
123f0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
12400 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
12410 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  (SSL_SESSION_get
12420 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e  _timeout(session
12430 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  )));.../* Sessio
12440 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d  n ticket lifetim
12450 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e  e hint (in secon
12460 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  ds) */..Tcl_List
12470 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12480 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12490 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
124a0 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31  j("lifetime", -1
124b0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
124c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
124d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
124e0 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c  l_NewLongObj(SSL
124f0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
12500 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
12510 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09  t(session)));...
12520 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20  /* Session id - 
12530 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f  TLSv1.2 and belo
12540 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69  w only */..sessi
12550 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
12560 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
12570 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c  on, &ulen);..Tcl
12580 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12590 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
125a0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
125b0 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f  ingObj("session_
125c0 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  id", -1));..Tcl_
125d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
125e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
125f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
12600 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e  ArrayObj(session
12610 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29  _id, (int) ulen)
12620 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12630 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73  context */..sess
12640 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
12650 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e  SION_get0_id_con
12660 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75  text(session, &u
12670 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  len);..Tcl_ListO
12680 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12690 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
126a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
126b0 28 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78  ("session_contex
126c0 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  t", -1));..Tcl_L
126d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
126e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
126f0 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
12700 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
12710 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29  id, (int) ulen))
12720 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
12730 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f  icket - client o
12740 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  nly */..SSL_SESS
12750 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28  ION_get0_ticket(
12760 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
12770 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c  , &len2);..Tcl_L
12780 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12790 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
127a0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
127b0 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69  gObj("session_ti
127c0 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63  cket", -1));..Tc
127d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
127e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
127f0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  bjPtr, Tcl_NewBy
12800 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65  teArrayObj(ticke
12810 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b  t, (int) len2));
12820 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70  .../* Ticket app
12830 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45   data */..SSL_SE
12840 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
12850 74 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 6f  t_appdata(sessio
12860 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
12870 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  2);..Tcl_ListObj
12880 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12890 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
128a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
128b0 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22  ticket_app_data"
128c0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
128d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
128e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
128f0 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
12900 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69  ayObj(ticket, (i
12910 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a  nt) len2));.../*
12920 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20   Get master key 
12930 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53  */..len2 = SSL_S
12940 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65  ESSION_get_maste
12950 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62  r_key(session, b
12960 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d  uffer, SSL_MAX_M
12970 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
12980 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12990 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
129a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
129b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
129c0 61 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31 29 29  aster_key", -1))
129d0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
129e0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
129f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12a00 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
12a10 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65  buffer, (int) le
12a20 6e 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n2));.    }..   
12a30 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20   /* Compression 
12a40 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
12a50 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23  ssl != NULL) {.#
12a60 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43  ifdef HAVE_SSL_C
12a70 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73  OMPRESSION..cons
12a80 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63  t COMP_METHOD *c
12a90 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d  omp, *expn;..com
12aa0 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  p = SSL_get_curr
12ab0 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28  ent_compression(
12ac0 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53  ssl);..expn = SS
12ad0 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78  L_get_current_ex
12ae0 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09  pansion(ssl);...
12af0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12b00 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12b10 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12b20 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72  StringObj("compr
12b30 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  ession", -1));..
12b40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12b50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12b60 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12b70 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f  StringObj(comp ?
12b80 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
12b90 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45  me(comp) : "NONE
12ba0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12bb0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12bc0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12bd0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12be0 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c  Obj("expansion",
12bf0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
12c00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12c10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12c20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12c30 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d  j(expn ? SSL_COM
12c40 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29  P_get_name(expn)
12c50 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b   : "NONE", -1));
12c60 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 73 74  .#else..Tcl_List
12c70 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12c80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12c90 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12ca0 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  j("compression",
12cb0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
12cc0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12cd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12ce0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12cf0 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  j("NONE", -1));.
12d00 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12d10 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12d20 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12d30 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61  wStringObj("expa
12d40 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  nsion", -1));..T
12d50 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12d60 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12d70 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12d80 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c  tringObj("NONE",
12d90 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20   -1));.#endif.  
12da0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76    }..    /* Serv
12db0 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b  er info */.    {
12dc0 0a 09 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58  ..mode = SSL_CTX
12dd0 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _get_session_cac
12de0 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
12df0 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d  ->ctx);..char *m
12e00 73 67 3b 0a 09 0a 09 69 66 20 28 6d 6f 64 65 20  sg;....if (mode 
12e10 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12e20 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
12e30 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
12e40 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
12e50 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
12e60 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
12e70 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
12e80 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12e90 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
12ea0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
12eb0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
12ec0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12ed0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
12ee0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
12ef0 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
12f00 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
12f10 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 54 63 6c  nknown";..}..Tcl
12f20 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12f30 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12f40 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
12f50 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f  ingObj("session_
12f60 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 29  cache_mode", -1)
12f70 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12f80 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12fa0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
12fb0 67 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a  g, -1));.    }..
12fc0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
12fd0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
12fe0 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
12ff0 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
13000 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
13010 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
13020 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
13030 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
13040 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
13050 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
13060 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
13070 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
13080 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
13090 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
130a0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
130b0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
130c0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
130d0 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ];..for (int i =
130e0 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f   0; i < sk_X509_
130f0 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
13100 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
13110 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d  509_NAME *name =
13120 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61   sk_X509_NAME_va
13130 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b  lue(ca_list, i);
13140 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20  ..    if (name) 
13150 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e  {...X509_NAME_on
13160 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66  eline(name, buff
13170 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54  er, BUFSIZ);...T
13180 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13190 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
131a0 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
131b0 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
131c0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09  , -1));..    }..
131d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  }.    }.    Tcl_
131e0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
131f0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
13200 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
13210 6e 67 4f 62 6a 28 22 63 61 4c 69 73 74 22 2c 20  ngObj("caList", 
13220 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
13230 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
13240 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
13250 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 0a 20 20  r, listPtr);..  
13260 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13270 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
13280 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
13290 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
132a0 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
132b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13300 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  . * VersionObjCm
13310 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73  d -- return vers
13320 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ion string from 
13330 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
13340 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
13350 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
13360 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
13370 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
13380 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
133d0 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62  ic int.VersionOb
133e0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
133f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
13400 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
13410 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
13420 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
13430 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
13440 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  objPtr;..    dpr
13450 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
13460 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
13470 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f  l_NewStringObj(O
13480 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54  PENSSL_VERSION_T
13490 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63  EXT, -1);.    Tc
134a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
134b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
134c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
134d0 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
134e0 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f  = clientData;..o
134f0 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a  bjc = objc;..obj
13500 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a  v = objv;.}.../*
13510 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13550 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
13560 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
13570 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
13580 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
13590 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
135a0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
135b0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
135c0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13600 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
13610 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
13620 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
13630 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
13640 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
13650 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
13660 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
13670 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13680 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
13690 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
136a0 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
136b0 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
136c0 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
136d0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
136e0 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74     int cmd, isSt
136f0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
13700 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20  er[16384];..    
13710 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
13720 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
13730 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
13740 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13750 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
13760 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
13770 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13780 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
13790 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
137a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
137b0 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
137c0 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63   "command", 0,&c
137d0 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  md) != TCL_OK) {
137e0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
137f0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
13800 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
13810 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28  ;..    isStr = (
13820 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29  cmd == C_STRREQ)
13830 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65  ;.    switch ((e
13840 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64  num command) cmd
13850 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a  ) {..case C_REQ:
13860 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a  ..case C_STRREQ:
13870 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59   {..    EVP_PKEY
13880 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20   *pkey=NULL;..  
13890 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c    X509 *cert=NUL
138a0 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d  L;..    X509_NAM
138b0 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20  E *name=NULL;.. 
138c0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73     Tcl_Obj **lis
138d0 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73  tv;..    int lis
138e0 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  tc,i;...    BIO 
138f0 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
13900 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b   char *k_C="",*k
13910 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a  _ST="",*k_L="",*
13920 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c  k_O="",*k_OU="",
13930 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69  *k_CN="",*k_Emai
13940 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20  l="";..    char 
13950 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c  *keyout,*pemout,
13960 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b  *str;..    int k
13970 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c  eysize,serial=0,
13980 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f  days=365;..#if O
13990 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
139a0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
139b0 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
139c0 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
139d0 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
139e0 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
139f0 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
13a00 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
13a10 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
13a20 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
13a30 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
13a40 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13a50 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
13a60 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
13a70 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
13a80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13a90 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
13aa0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13ab0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
13ac0 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
13ad0 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
13ae0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
13af0 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
13b00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13b10 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
13b20 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
13b30 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
13b40 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
13b50 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
13b60 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
13b70 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13b80 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
13b90 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
13ba0 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
13bb0 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
13bc0 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
13bd0 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c  , objv[5],....&l
13be0 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d  istc, &listv) !=
13bf0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20   TCL_OK) {...   
13c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13c10 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c  R;...}....if ((l
13c20 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a  istc%2) != 0) {.
13c30 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
13c40 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f  ult(interp,"Info
13c50 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73  rmation list mus
13c60 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62  t have even numb
13c70 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22  er of arguments"
13c80 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
13c90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13ca0 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20  ..}...for (i=0; 
13cb0 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b  i<listc; i+=2) {
13cc0 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47  ...    str=Tcl_G
13cd0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13ce0 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74  ]);...    if (st
13cf0 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29  rcmp(str,"days")
13d00 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
13d10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13d20 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
13d30 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b  ],&days)!=TCL_OK
13d40 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
13d50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
13d60 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13d70 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29  mp(str,"serial")
13d80 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
13d90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13da0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
13db0 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f  ],&serial)!=TCL_
13dc0 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
13dd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
13de0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13df0 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30  rcmp(str,"C")==0
13e00 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47  ) {....k_C=Tcl_G
13e10 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13e20 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13e30 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13e40 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"ST")==0) {...
13e50 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72  .k_ST=Tcl_GetStr
13e60 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13e70 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13e80 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22   (strcmp(str,"L"
13e90 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54  )==0) {....k_L=T
13ea0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13eb0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13ec0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13ed0 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b  p(str,"O")==0) {
13ee0 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53  ....k_O=Tcl_GetS
13ef0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13f00 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13f10 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13f20 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  OU")==0) {....k_
13f30 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  OU=Tcl_GetString
13f40 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13f50 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13f60 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d  trcmp(str,"CN")=
13f70 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63  =0) {....k_CN=Tc
13f80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13f90 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13fa0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13fb0 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30  (str,"Email")==0
13fc0 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54  ) {....k_Email=T
13fd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13fe0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13ff0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f  } else {....Tcl_
14000 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
14010 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65  ,"Unknown parame
14020 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72  ter",NULL);....r
14030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14040 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
14050 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
14060 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
14070 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
14080 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28     bne = BN_new(
14090 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53  );..    rsa = RS
140a0 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b  A_new();..    pk
140b0 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65  ey = EVP_PKEY_ne
140c0 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e  w();..    if (bn
140d0 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61  e == NULL || rsa
140e0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79   == NULL || pkey
140f0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f   == NULL || !BN_
14100 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41  set_word(bne,RSA
14110 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67  _F4) ||...!RSA_g
14120 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72  enerate_key_ex(r
14130 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65  sa, keysize, bne
14140 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f  , NULL) || !EVP_
14150 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28  PKEY_assign_RSA(
14160 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09  pkey, rsa)) {...
14170 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14180 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72  ey);.../* RSA_fr
14190 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62  ee(rsa); freed b
141a0 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20  y EVP_PKEY_free 
141b0 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65  */...BN_free(bne
141c0 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b  );.#else..    pk
141d0 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e  ey = EVP_RSA_gen
141e0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
141f0 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63  keysize);..    c
14200 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54  tx = EVP_PKEY_CT
14210 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29  X_new(pkey,NULL)
14220 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20  ;..    if (pkey 
14230 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d  == NULL || ctx =
14240 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50  = NULL || !EVP_P
14250 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28  KEY_keygen_init(
14260 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50  ctx) ||...!EVP_P
14270 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f  KEY_CTX_set_rsa_
14280 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c  keygen_bits(ctx,
14290 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56   keysize) || !EV
142a0 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74  P_PKEY_keygen(ct
142b0 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45  x, &pkey)) {...E
142c0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
142d0 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43  y);...EVP_PKEY_C
142e0 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65  TX_free(ctx);.#e
142f0 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65  ndif...Tcl_SetRe
14300 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
14310 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72  or generating pr
14320 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29  ivate key",NULL)
14330 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
14340 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73  RROR;..    } els
14350 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29  e {...if (isStr)
14360 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14370 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
14380 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
14390 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
143a0 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
143b0 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
143c0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
143d0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
143e0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
143f0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
14400 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
14410 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
14420 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
14430 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75  interp,keyout,bu
14440 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
14450 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
14460 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
14470 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
14480 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
14490 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
144a0 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
144b0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79  filename(out,key
144c0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
144d0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74  write_bio_Privat
144e0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55  eKey(out,pkey,NU
144f0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e  LL,NULL,0,NULL,N
14500 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50  ULL);...    /* P
14510 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41  EM_write_bio_RSA
14520 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20  PrivateKey(out, 
14530 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  rsa, NULL, NULL,
14540 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b   0, NULL, NULL);
14550 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72   */...    BIO_fr
14560 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09  ee_all(out);.. .
14570 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58  }....if ((cert=X
14580 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c  509_new())==NULL
14590 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
145a0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
145b0 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  Error generating
145c0 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71   certificate req
145d0 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  uest",NULL);... 
145e0 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
145f0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
14600 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
14610 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
14620 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
14630 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
14640 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52    return(TCL_ERR
14650 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  OR);...}....X509
14660 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
14670 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
14680 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
14690 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
146a0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
146b0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
146c0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
146d0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
146e0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
146f0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
14700 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
14710 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
14720 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
14730 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
14740 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
14750 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
14760 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
14770 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14780 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
14790 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
147a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
147b0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
147c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
147d0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
147e0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
147f0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14800 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14810 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
14820 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14830 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14840 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
14850 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14860 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14870 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
14880 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14890 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
148a0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
148b0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
148c0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
148d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
148e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
148f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14900 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
14910 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14920 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
14930 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14940 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14950 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14960 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
14970 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14980 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
14990 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
149a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
149b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
149c0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
149d0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
149e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
149f0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
14a00 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
14a10 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
14a20 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
14a30 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
14a40 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
14a50 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
14a60 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
14a70 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
14a80 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
14a90 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
14aa0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
14ab0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
14ac0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
14ad0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
14ae0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
14af0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
14b00 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
14b10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14b20 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
14b30 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
14b40 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
14b50 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
14b60 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
14b70 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
14b80 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
14b90 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
14ba0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
14bb0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
14bc0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
14bd0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
14be0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
14bf0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
14c00 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
14c10 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
14c20 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
14c30 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
14c40 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
14c50 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
14c60 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
14c70 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
14c80 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
14c90 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
14ca0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
14cb0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
14cc0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
14cd0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
14ce0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
14cf0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
14d00 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
14d10 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
14d20 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
14d30 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
14d40 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
14d50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
14d60 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
14d70 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
14d80 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
14d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
14da0 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  Init            
14db0 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
14dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
14dd0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e10 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46  ----. *. * Tls_F
14e20 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ree --. *. *.Thi
14e30 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
14e40 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
14e50 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
14e60 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
14e70 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
14e80 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
14e90 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52   below 1. *. * R
14ea0 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
14eb0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
14ec0 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
14ed0 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
14ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f20 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73  ---. */.void.Tls
14f30 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63  _Free(char *bloc
14f40 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74  kPtr) {.    Stat
14f50 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
14f60 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b  tate *)blockPtr;
14f70 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
14f80 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c  alled");..    Tl
14f90 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72  s_Clean(statePtr
14fa0 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c  );.    ckfree(bl
14fb0 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  ockPtr);.}.../*.
14fc0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15000 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
15010 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54  Clean --. *. *.T
15020 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
15030 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
15040 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
15050 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
15060 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
15070 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
15080 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69  ls below 1.  Thi
15090 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63  s should. *.be c
150a0 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75  alled synchronou
150b0 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65  sly by the Close
150c0 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Proc, not in the
150d0 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72  . *.EventuallyFr
150e0 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  ee callback.. *.
150f0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
15100 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
15110 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
15120 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
15130 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15170 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
15180 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65   Tls_Clean(State
15190 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20   *statePtr) {.  
151a0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
151b0 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  d");..    /*.   
151c0 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69    * we're assumi
151d0 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27  ng here that we'
151e0 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  re single-thread
151f0 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed.     */.    i
15200 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
15210 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
15220 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
15230 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
15240 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
15250 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
15260 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c  tr->timer = NULL
15270 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
15280 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
15290 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61  s) {..ckfree(sta
152a0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a  tePtr->protos);.
152b0 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
152c0 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  s = NULL;.    }.
152d0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
152e0 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69  ->bio) {../* Thi
152f0 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f  s will call SSL_
15300 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34  shutdown. Bug 14
15310 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74  14045 */..dprint
15320 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  f("BIO_free_all(
15330 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
15340 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f  bio);..BIO_free_
15350 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  all(statePtr->bi
15360 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62  o);..statePtr->b
15370 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  io = NULL;.    }
15380 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
15390 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e  r->ssl) {..dprin
153a0 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29  tf("SSL_free(%p)
153b0 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ", statePtr->ssl
153c0 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61  );..SSL_free(sta
153d0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74  tePtr->ssl);..st
153e0 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55  atePtr->ssl = NU
153f0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
15400 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29   (statePtr->ctx)
15410 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65   {..SSL_CTX_free
15420 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
15430 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20  ..statePtr->ctx 
15440 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
15450 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
15460 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c  callback) {..Tcl
15470 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _DecrRefCount(st
15480 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
15490 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61  );..statePtr->ca
154a0 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  llback = NULL;. 
154b0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
154c0 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
154d0 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
154e0 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70  ount(statePtr->p
154f0 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65  assword);..state
15500 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20  Ptr->password = 
15510 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
15520 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
15530 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  md) {..Tcl_DecrR
15540 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
15550 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50  ->vcmd);..stateP
15560 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b  tr->vcmd = NULL;
15570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
15580 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
15590 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
155a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
155e0 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
155f0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
15600 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
15610 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
15620 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
15630 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65  ed. *.by Tcl whe
15640 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
15650 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
15660 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
15670 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20  . *. * Results: 
15680 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20   Ssl configured 
15690 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a  and loaded. *. *
156a0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
156b0 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73  *. create the ss
156c0 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69  l command, initi
156d0 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78  alize ssl contex
156e0 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44  ----------. */.D
15730 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
15740 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
15750 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
15760 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63  const char tlsTc
15770 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20  lInitScript[] = 
15780 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e  {.#include "tls.
15790 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20  tcl.h"..0x00.   
157a0 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   };..    dprintf
157b0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
157c0 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e   /*.     * We on
157d0 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38  ly support Tcl 8
157e0 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20  .4 or newer.    
157f0 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66   */.    if (.#if
15800 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
15810 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  S..Tcl_InitStubs
15820 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
15830 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b  0).#else..Tcl_Pk
15840 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c  gRequire(interp,
15850 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20   "Tcl", "8.4-", 
15860 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e  0).#endif.. == N
15870 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
15880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15890 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
158a0 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
158b0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
158c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
158d0 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
158e0 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
158f0 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
15900 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15910 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  }..    Tcl_Creat
15920 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15930 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  rp, "tls::cipher
15940 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
15950 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15960 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
15970 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15980 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15990 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
159a0 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f   "tls::connectio
159b0 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
159c0 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
159d0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
159e0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
159f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
15a00 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15a10 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61  interp, "tls::ha
15a20 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
15a30 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  akeObjCmd, (Clie
15a40 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
15a50 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15a60 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15a70 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15a80 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69  (interp, "tls::i
15a90 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62  mport", ImportOb
15aa0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15ab0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
15ac0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15ad0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15ae0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15af0 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f  rp, "tls::unimpo
15b00 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  rt", UnimportObj
15b10 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15b20 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
15b30 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15b40 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15b50 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15b60 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22  p, "tls::status"
15b70 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20  , StatusObjCmd, 
15b80 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
15b90 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15ba0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15bb0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15bc0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15bd0 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65  ls::version", Ve
15be0 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c  rsionObjCmd, (Cl
15bf0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15c00 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15c10 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15c20 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15c30 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15c40 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
15c50 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15c60 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
15c70 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15c80 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15c90 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15ca0 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c  , "tls::protocol
15cb0 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  s", ProtocolsObj
15cc0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15cd0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
15ce0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15cf0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72  ;..    if (inter
15d00 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69  p) {..Tcl_Eval(i
15d10 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
15d20 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  tScript);.    }.
15d30 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f  .    return(Tcl_
15d40 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
15d50 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47  p, "tls", PACKAG
15d60 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a  E_VERSION));.}..
15d70 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15db0 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
15dc0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
15dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74  ---------*. *.St
15e00 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
15e10 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
15e20 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
15e30 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
15e40 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
15e50 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
15e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15e90 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
15ea0 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
15eb0 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
15ec0 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
15ed0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
15ee0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
15ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f20 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
15f30 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
15f40 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
15f50 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
15f60 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
15f70 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e     return(Tls_In
15f80 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a  it(interp));.}..
15f90 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15fd0 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
15fe0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16010 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
16020 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
16030 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
16040 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
16080 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
16090 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
160a0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
160b0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
160c0 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16100 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
16110 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
16120 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
16130 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
16140 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
16150 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
16160 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
16170 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16180 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16190 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
161a0 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
161b0 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
161c0 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
161d0 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
161e0 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
161f0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
16200 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
16210 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
16220 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
16230 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
16240 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
16250 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
16260 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65  alize");..#if de
16270 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
16280 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
16290 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
162a0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
162b0 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c  nit_mx);...if (l
162c0 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65  ocks) {..    fre
162d0 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c  e(locks);..    l
162e0 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ocks = NULL;..  
162f0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30    locksCount = 0
16300 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69  ;..}.#endif..ini
16310 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23  tialized = 0;..#
16320 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16330 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16340 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16350 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
16360 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
16370 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
16380 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a  TCL_OK);.    }..
16390 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69      if (initiali
163a0 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  zed) {..dprintf(
163b0 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69  "Called, but usi
163c0 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22  ng cached value"
163d0 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  );..return(statu
163e0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  s);.    }..    d
163f0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
16400 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16410 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16420 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16430 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
16440 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
16450 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
16460 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
16470 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
16480 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
16490 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
164a0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
164b0 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
164c0 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
164d0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
164e0 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
164f0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
16500 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
16510 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
16520 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
16530 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
16540 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
16550 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
16560 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
16570 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
16580 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
16590 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
165a0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
165b0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
165c0 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
165d0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
165e0 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
165f0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
16600 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
16610 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
16620 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
16630 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
16640 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
16650 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
16660 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
16670 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
16680 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
16690 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
166a0 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
166b0 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
166c0 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
166d0 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
166e0 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
166f0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
16700 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
16710 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
16720 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
16730 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
16740 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
16750 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
16760 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
16770 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
16780 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
16790 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
167a0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
167b0 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
167c0 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
167d0 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
167e0 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
167f0 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
16800 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
16810 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
16820 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
16830 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
16840 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
16850 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
16860 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
16870 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
16880 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
16890 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
168a0 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
168b0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
168c0 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
168d0 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
168e0 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
168f0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
16900 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
16910 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
16920 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
16930 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
16940 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
16950 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
16960 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
16970 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
16980 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
16990 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
169a0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
169b0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
169c0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
169d0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
169e0 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
169f0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
16a00 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61  dif...return(sta
16a10 74 75 73 29 3b 0a 7d 0a                          tus);.}.