Hex Artifact Content

Artifact c6cfb160ec3da736097f8e38190c20aeb0c71da01a4761b46cb4b41cfc0a5fb9:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63  ode, ok;..    Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72  with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61   ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20  lue 1, fail for 
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20  error or return 
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63  value 0 */.    c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20    ok = 1;..}.   
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72   } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65  ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43  .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0f10: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a  r;.    char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b  or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10f0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
1100: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1110: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
1120: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1130: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1140: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1150: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1160: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1170: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1180: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1190: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
11a0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
11b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
11c0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
11d0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11e0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11f0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
1200: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1220: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1230: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1240: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1250: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1280: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1290: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
12a0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
12b0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12d0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12e0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12f0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1300: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
1310: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
1320: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1330: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1340: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1350: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1360: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1370: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1380: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1390: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13d0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
13e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1400: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1430: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1440: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1480: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
1490: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14d0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
14e0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
14f0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1520: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1550: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1560: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1580: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15b0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15c0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
15e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1600: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1620: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1630: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1670: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
1680: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
1690: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
16e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
16f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1710: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1770: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
1780: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
1790: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
17e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1850: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1860: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1870: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
1880: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
1890: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18a0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18b0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18c0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
18e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
18f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1900: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1930: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1940: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1950: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1960: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1970: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
1980: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1990: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19b0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19c0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19d0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
19e0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
19f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a00: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a10: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a20: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a40: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a50: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ab0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1ac0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1ad0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1ae0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1af0: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b00: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b20: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b30: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b50: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b60: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1b70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1b80: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1b90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1ba0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1bb0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20  case 0:.        
1bc0: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62  ver = "none";..b
1bd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1be0: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f  t:..ver = "unkno
1bf0: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  wn";..break;.   
1c00: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
1c10: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a  content_type) {.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c30: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d  _HEADER:..type =
1c40: 20 22 48 65 61 64 65 72 22 3b 0a 20 20 20 20 20   "Header";.     
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c60: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52  se SSL3_RT_INNER
1c70: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09  _CONTENT_TYPE:..
1c80: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f  type = "Inner Co
1c90: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 20 20 20  ntent Type";.   
1ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1cc0: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1cd0: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1ce0: 20 43 69 70 68 65 72 22 3b 0a 20 20 20 20 20 20   Cipher";.      
1cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d00: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a  e SSL3_RT_ALERT:
1d10: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22  ..type = "Alert"
1d20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d40: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1d50: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d70: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d80: 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41  T_APPLICATION_DA
1d90: 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70  TA:..type = "App
1da0: 20 44 61 74 61 22 3b 0a 20 20 20 20 20 20 20 20   Data";.        
1db0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1dc0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1dd0: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1de0: 72 74 62 65 61 74 22 3b 0a 20 20 20 20 20 20 20  rtbeat";.       
1df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1e00: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e20: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e30: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e40: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e50: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e60: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e70: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e80: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e90: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ea0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1eb0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ec0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1ed0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ee0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ef0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1f00: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1f10: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f20: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f30: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f40: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 20 09 42 49  flush(bio);. .BI
1f50: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
1f60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1f70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1f80: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1fa0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1fb0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1ff0: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2020: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2030: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2040: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2050: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2060: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2070: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20b0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
20c0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2120: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2130: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2140: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
2160: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
21b0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
21c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
21d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
21e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
21f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2200: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2210: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
2240: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 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 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
22a0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
22b0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
22c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
22d0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
22e0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
22f0: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2300: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2310: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2320: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
2330: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
2340: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
2350: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
2360: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
2370: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2380: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2390: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
23a0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
23b0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
23c0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
23d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
23e0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
23f0: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2400: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2410: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2420: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2430: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2440: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2450: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
2460: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
2470: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2480: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2490: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24b0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
24c0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
24d0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
24e0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
24f0: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2500: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2520: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2530: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2540: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2550: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
2560: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
2570: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2580: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2590: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25a0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25b0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
25c0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
25d0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
25e0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
25f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2600: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2610: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2620: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2630: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2640: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2650: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
2660: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
2670: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2680: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2690: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26b0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
26c0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
26d0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
26e0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
26f0: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2700: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2710: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2720: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2740: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2750: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2760: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2770: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2780: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2790: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27a0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27b0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73  ----------. */.s
2800: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2820: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2830: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2840: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2850: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
2860: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
2870: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2880: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2890: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
28a0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
28b0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
28c0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28d0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
28e0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
28f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2900: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2910: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
2920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2930: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
2940: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
2950: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
2960: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
2970: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2980: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29a0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
29b0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
29c0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
29d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
29e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
29f0: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65  LL) {..if (state
2a00: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a10: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a20: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2a40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2a50: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2a60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2a70: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
2a80: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
2a90: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2aa0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
2ab0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
2ac0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2ad0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ae0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2af0: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
2b00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2b30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b40: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2b50: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2b60: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2ba0: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20  ntObj(depth));. 
2bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f  rp, cmdPtr, Tls_
2be0: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
2bf0: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
2c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2c30: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2c40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c60: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2c70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2c80: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2c90: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2ca0: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2cb0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2cc0: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2cd0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2ce0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2cf0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2d00: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2d10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2d20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2d30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2d40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2d50: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c     ok = EvalCall
2d60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2d70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2d80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2d90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2da0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e     /* statePtr->
2db0: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54  flags &= ~(TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f  CL_CALLBACK); */
2dd0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b  .    return(ok);
2de0: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
2df0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
2e00: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  on unchanged. */
2e10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2e60: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2e70: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2e80: 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20  lback with list 
2e90: 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a  of errors.. *. *
2ea0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2eb0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2ec0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2ed0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
2ee0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
2ef0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
2f00: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2f10: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2f20: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2f70: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
2f80: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
2f90: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b  tr, char *msg) {
2fa0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2fb0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
2fc0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
2fd0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c  Tcl_Obj *cmdPtr,
2fe0: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75   *listPtr;.    u
2ff0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72  nsigned long err
3000: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
3010: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20  err = msg;..    
3020: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3030: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
3040: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
3050: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
3060: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
3070: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3080: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
3090: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
30a0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
30b0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
30c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
30d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
30e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
30f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
3100: 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rror", -1));.   
3110: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3120: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3130: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3150: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
3160: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
3170: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  f), -1));.    if
3180: 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b   (msg != NULL) {
3190: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
31a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
31b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
31c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c  ewStringObj(msg,
31d0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c   -1));..    } el
31e0: 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63  se if ((msg = Tc
31f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3200: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3210: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c  ult(interp), NUL
3220: 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  L)) != NULL) {..
3230: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3240: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3250: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3260: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3270: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3280: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3290: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
32a0: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
32b0: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
32c0: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
32d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
32e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
32f0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
3300: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
3310: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
3320: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
3330: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
3340: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3350: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3360: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3370: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3380: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3390: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
33a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
33b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
33c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
33d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
33e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
3400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3450: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3460: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3470: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3480: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3490: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
34a0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
34f0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
3500: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
3510: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
3520: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
3530: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
3540: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3550: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3560: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3570: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3580: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3590: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
35a0: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
35b0: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
35c0: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
35d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
3620: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
3630: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3640: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3650: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b   for a private k
3660: 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69  ey loading/stori
3670: 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74  ng a PEM. *.cert
3680: 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63  ificate with enc
3690: 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63  ryption. Evals c
36a0: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61  allback script a
36b0: 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68  nd returns. *.th
36c0: 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  e result as the 
36d0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
36e0: 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65  in buf.. *. * Re
36f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
3700: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3710: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
3720: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
3730: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  ). *. * Returns:
3740: 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a  . *.Password siz
3750: 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31  e in bytes or -1
3760: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
3770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
37c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
37d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
37e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
37f0: 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75   rwflag, void *u
3800: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74  data) {.    Stat
3810: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
3820: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20  tate *) udata;. 
3830: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3840: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
3850: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
3860: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
3870: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20     int code;..  
3880: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3890: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  d");..    /* If 
38a0: 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65  no callback, use
38b0: 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63   default callbac
38c0: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  k */.    if (sta
38d0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
38e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  == NULL) {..if (
38f0: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72  Tcl_EvalEx(inter
3900: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72  p, "tls::passwor
3910: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  d", -1, TCL_EVAL
3920: 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f  _GLOBAL) == TCL_
3930: 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  OK) {..    char 
3940: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3950: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3960: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20  ult(interp);..  
3970: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72    strncpy(buf, r
3980: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a  et, (size_t) siz
3990: 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e);..    return 
39a0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29  (int)strlen(ret)
39b0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
39c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
39d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
39e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
39f0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
3a00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3a10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
3a20: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63  assword);.    Tc
3a30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3a40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3a50: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3a60: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72  ringObj("passwor
3a70: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
3a80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3a90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3aa0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3ab0: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20  tObj(rwflag));. 
3ac0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ad0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3ae0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3af0: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29  NewIntObj(size))
3b00: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3b10: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3b20: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
3b30: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
3b40: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
3b50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
3b60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
3b70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
3b80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3b90: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
3ba0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
3bb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
3bc0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
3bd0: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c   if (code != TCL
3be0: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f  _OK) {.#if (TCL_
3bf0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
3c00: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
3c10: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
3c20: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
3c30: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
3c40: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
3c50: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
3c60: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69  rp, code);.#endi
3c70: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  f.    }.    Tcl_
3c80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
3c90: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  Ptr);..    Tcl_R
3ca0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3cb0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
3cc0: 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73      /* If succes
3cd0: 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20  sful, pass back 
3ce0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
3cf0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20  and truncate if 
3d00: 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20  too long */.    
3d10: 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f  if (code == TCL_
3d20: 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b 0a  OK) {..int len;.
3d30: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68  .char *ret = (ch
3d40: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72  ar *) Tcl_GetStr
3d50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3d60: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3d70: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  rp), &len);..if 
3d80: 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20 7b  (len > size-1) {
3d90: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a 65  ..    len = size
3da0: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
3db0: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
3dc0: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
3dd0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
3de0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72  ata) interp);..r
3e00: 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20 20  eturn(len);.    
3e10: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
3e20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
3e40: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
3ea0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
3eb0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
3ec0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
3ed0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
3ee0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
3ef0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
3f00: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
3f10: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
3f20: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
3f30: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
3f40: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
3f50: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
3f60: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
3f80: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
3f90: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
3fa0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
3fb0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
3fc0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3fd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3fe0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3ff0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4000: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4010: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
4020: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4030: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4040: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
4050: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
4060: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
4070: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
4080: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
4090: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
40a0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
40b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
40c0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
40d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4120: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4130: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
4140: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
4150: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
4160: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4170: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
4180: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4190: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
41a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
41b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
41c0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
41d0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
41e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
41f0: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4200: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4210: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4220: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
4230: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
4240: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
4250: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4260: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4270: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
4280: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4290: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
42a0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
42b0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
42c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
42d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
42e0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
42f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4300: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4310: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4320: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4330: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
4340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4380: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  ("session", -1))
4390: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
43a0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
43b0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
43c0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
43d0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
43e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
43f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4400: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4410: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4420: 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20  ssion_id, (int) 
4430: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
4440: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
4450: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
4460: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
4470: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
4480: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
4490: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
44a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
44b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
44c0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
44d0: 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a   (int) len2));..
44e0: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20      /* Lifetime 
44f0: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  - number of seco
4500: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  nds */.    Tcl_L
4510: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4520: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4530: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67  tr,..Tcl_NewLong
4540: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53  Obj((long) SSL_S
4550: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65  ESSION_get_ticke
4560: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28  t_lifetime_hint(
4570: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20  session)));..   
4580: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
4590: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
45a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
45b0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45  t(cmdPtr);.    E
45c0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
45d0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
45e0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  dPtr);.    Tcl_D
45f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
4600: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
4610: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0;.}.../*. *----
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4660: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62   *. * ALPN Callb
4670: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
4680: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b  and NPN Callback
4690: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
46a0: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72   *. *.Perform pr
46b0: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31  otocol (http/1.1
46c0: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20  , h2, h3, etc.) 
46d0: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68  selection for th
46e0: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f  e. *.incoming co
46f0: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64  nnection. Called
4700: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64   after Hello and
4710: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b   server callback
4720: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74  s.. *.Where 'out
4730: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72  ' is selected pr
4740: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20  otocol and 'in' 
4750: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65  is the peer adve
4760: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a  rtised list.. *.
4770: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
4780: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
4790: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
47a0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
47b0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
47c0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
47d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
47e0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73   ALPN protocol s
47f0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
4800: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4810: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
4820: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
4830: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f  : There was no o
4840: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74  verlap between t
4850: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20  he client's. *. 
4860: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74     supplied list
4870: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20   and the server 
4880: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
4890: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
48a0: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20  ll be aborted.. 
48b0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
48c0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f  _NOACK: ALPN pro
48d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
48e0: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73  ed, e.g., becaus
48f0: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20  e no ALPN. *.   
4900: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63   protocols are c
4910: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
4920: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  is connection. T
4930: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
4940: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
49a0: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f  .ALPNCallback(co
49b0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
49c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
49d0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65  r **out, unsigne
49e0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a  d char *outlen,.
49f0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
4a00: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e  char *in, unsign
4a10: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f  ed int inlen, vo
4a20: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
4a30: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4a40: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
4a50: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4a60: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4a70: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4a80: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4a90: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
4aa0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4ab0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4ac0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
4ad0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
4ae0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4af0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65    }..    /* Sele
4b10: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20  ct protocol */. 
4b20: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63     if (SSL_selec
4b30: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74  t_next_proto(out
4b40: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4b50: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4b60: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4b70: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4b80: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4b90: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4ba0: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4bb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4bc0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4bd0: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4be0: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4bf0: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4c00: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4c10: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4c20: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..re
4c30: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4c40: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4c50: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4c60: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4c70: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4c80: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
4c90: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4ca0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a  ommand to eval *
4cb0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
4cc0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
4cd0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
4ce0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4cf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4d00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4d10: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4d20: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  alpn", -1));.   
4d30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4d40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4d50: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4d60: 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c  wStringObj(*out,
4d70: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   -1));..    /* E
4d80: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
4d90: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
4da0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
4db0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
4dc0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
4dd0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
4de0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
4df0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
4e00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4e10: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4e20: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
4e30: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4e40: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4e50: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
4e60: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
4e70: 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20  _FATAL;.    }.  
4e80: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4e90: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
4ea0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
4eb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
4f00: 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f  dvertise Protoco
4f10: 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ls Callback for 
4f20: 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65  Next Protocol Ne
4f30: 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20  gotiation (NPN) 
4f40: 69 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d  in ServerHello -
4f50: 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77  -. *. *.called w
4f60: 68 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72  hen a TLS server
4f70: 20 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66   needs a list of
4f80: 20 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f   supported proto
4f90: 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a  cols for Next. *
4fa0: 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69  .Protocol Negoti
4fb0: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ation.. *. * Res
4fc0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
4fd0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4fe0: 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  :. *. * Return c
4ff0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
5000: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20  EXT_ERR_OK: NPN 
5010: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
5020: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
5030: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
5040: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5050: 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  OACK: NPN protoc
5060: 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e  ol not selected.
5070: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5080: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55  ---. */.#ifdef U
50e0: 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e  SE_NPN.static in
50f0: 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f  t.NPNCallback(co
5100: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
5110: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5120: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65  r **out, unsigne
5130: 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76  d int *outlen, v
5140: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
5150: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
5160: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a  = (State*)arg;..
5170: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5180: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
5190: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
51a0: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
51b0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
51c0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
51d0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72  }..    /* Set pr
51e0: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a  otocols list */.
51f0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
5200: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c  ->protos != NULL
5210: 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74  ) {..*out = stat
5220: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a  ePtr->protos;..*
5230: 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74  outlen = statePt
5240: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20  r->protos_len;. 
5250: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75     } else {..*ou
5260: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c  t = NULL;..*outl
5270: 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20  en = 0;..return 
5280: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5290: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OACK;.    }.    
52a0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
52b0: 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  T_ERR_OK;.}.#end
52c0: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5310: 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b  . * SNI Callback
5320: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a   for Servers --.
5330: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65   *. *.Perform se
5340: 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f  rver-side SNI ho
5350: 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e  stname selection
5360: 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67   after receiving
5370: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20   SNI extension. 
5380: 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c  *.in Client Hell
5390: 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  o. Called after 
53a0: 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62  hello callback b
53b0: 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63  ut before ALPN c
53c0: 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
53d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
53e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
53f0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
5400: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
5410: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
5420: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
5430: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49  SEXT_ERR_OK: SNI
5440: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63   hostname is acc
5450: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
5460: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5470: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5480: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
5490: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
54a0: 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68  not accepted. Th
54b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09  e connection. *.
54c0: 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20      is aborted. 
54d0: 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72  Default for aler
54e0: 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45  t is SSL_AD_UNRE
54f0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20  COGNIZED_NAME.. 
5500: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5510: 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20  _ALERT_WARNING: 
5520: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5530: 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61  not accepted, wa
5540: 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20  rning alert. *. 
5550: 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70     sent (not sup
5560: 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e  ported in TLSv1.
5570: 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  3). The connecti
5580: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5590: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
55a0: 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  NOACK: SNI hostn
55b0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70  ame is not accep
55c0: 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e  ted and not ackn
55d0: 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20  owledged,. *.   
55e0: 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73   e.g. if SNI has
55f0: 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67   not been config
5600: 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  ured. The connec
5610: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5620: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
5670: 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62  tic int.SNICallb
5680: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
5690: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20  sl, int *alert, 
56a0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
56b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
56c0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
56d0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
56e0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
56f0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
5700: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
5710: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65      int code, re
5720: 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72  s;.    char *ser
5730: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  vername = NULL;.
5740: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5750: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5760: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5770: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5780: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5790: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
57a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
57b0: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e  works for TLS 1.
57c0: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f  2 and earlier */
57d0: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
57e0: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  = SSL_get_server
57f0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
5800: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
5810: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ame);.    if (!s
5820: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72  ervername || ser
5830: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c  vername[0] == '\
5840: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  0') {..return SS
5850: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5860: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5870: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5880: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5890: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
58a0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
58b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
58c0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
58d0: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d  o eval */.    cm
58e0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
58f0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
5900: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c  ->vcmd);.    Tcl
5910: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5920: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5930: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
5940: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31  ingObj("sni", -1
5950: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5960: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5970: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5980: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5990: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
59a0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
59b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
59c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
59d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
59e0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
59f0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
5a00: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5a10: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
5a20: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5a30: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57  SEXT_ERR_ALERT_W
5a40: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20  ARNING;..*alert 
5a50: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
5a60: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
5a70: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
5a80: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
5a90: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5aa0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5ab0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
5ad0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5ae0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
5af0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
5b00: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5b10: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
5b20: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
5b30: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   */.    }.    Tc
5b40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
5b50: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
5b60: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
5b70: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bb0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e  ----. *. * Clien
5bc0: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65  tHello Handshake
5bd0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
5be0: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55  rvers --. *. *.U
5bf0: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f  sed by server to
5c00: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72   examine the ser
5c10: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
5c20: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73  ion (SNI) extens
5c30: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20  ion. *.provided 
5c40: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e  by the client in
5c50: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74   order to select
5c60: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
5c70: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20  certificate to. 
5c80: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d  *.present, and m
5c90: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67  ake other config
5ca0: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65  uration adjustme
5cb0: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20  nts relevant to 
5cc0: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e  that server. *.n
5cd0: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66  ame and its conf
5ce0: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iguration. This 
5cf0: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e  includes swappin
5d00: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69  g out the associ
5d10: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20  ated. *.SSL_CTX 
5d20: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69  pointer, modifyi
5d30: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
5d40: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65  list of permitte
5d50: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a  d TLS versions,.
5d60: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20   *.changing the 
5d70: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20  server's cipher 
5d80: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65  list in response
5d90: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73   to the client's
5da0: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74   cipher list, et
5db0: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66  c.. *.Called bef
5dc0: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e  ore SNI and ALPN
5dd0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20   callbacks.. *. 
5de0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5df0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
5e00: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
5e10: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
5e20: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
5e30: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5e40: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
5e50: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65  TRY: suspend the
5e60: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20   handshake, and 
5e70: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75  the handshake fu
5e80: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
5e90: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  rn immediately. 
5ea0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
5eb0: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72  LO_ERROR: failur
5ec0: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e  e, terminate con
5ed0: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65  nection. Set ale
5ee0: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65  rt to error code
5ef0: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  .. *.SSL_CLIENT_
5f00: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73  HELLO_SUCCESS: s
5f10: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  uccess. *. *----
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5f60: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48   */.static int.H
5f70: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  elloCallback(con
5f80: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
5f90: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
5fa0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5fb0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5fc0: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
5fd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
5fe0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
5ff0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
6000: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
6010: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
6020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76  const char *serv
6030: 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  ername;.    cons
6040: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6050: 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  *p;.    size_t l
6060: 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a  en, remaining;..
6070: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6080: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
6090: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
60a0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
60b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
60c0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
60d0: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
60e0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
60f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
6100: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6110: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6120: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6130: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6140: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
6150: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
6160: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
6170: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
6180: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
6190: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
61a0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
61b0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
61c0: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
61d0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
61e0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
61f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6200: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6210: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6220: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6230: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6240: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
6250: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
6260: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
6270: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
6280: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6290: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
62a0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
62b0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
62c0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
62d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
62e0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
62f0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6300: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6310: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6320: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6330: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6340: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
6350: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
6360: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
6370: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
6380: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
6390: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
63a0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
63b0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
63c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
63d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
63e0: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
63f0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6400: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6410: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6420: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6430: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6440: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
6450: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
6460: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6470: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6480: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6490: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
64a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
64b0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
64c0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
64d0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
64e0: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
64f0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6500: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6510: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6520: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6530: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6540: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6550: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6560: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6570: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6580: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6590: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
65a0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
65b0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
65c0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
65d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
65e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
65f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
6600: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c  wStringObj("hell
6610: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
6620: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6630: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6640: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6650: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
6660: 6d 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b  me, (int) len));
6670: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
6680: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
6690: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
66a0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
66b0: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
66c0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
66d0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
66e0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
66f0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6700: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a  _HELLO_RETRY;..*
6710: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6720: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43  SV1_ALERT_USER_C
6730: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20  ANCELLED;.    } 
6740: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
6750: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6760: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6770: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6780: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  e {..res = SSL_C
6790: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
67a0: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  R;..*alert = SSL
67b0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
67c0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20  NTERNAL_ERROR;. 
67d0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
67e0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
67f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6800: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s;.}.../********
6810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
6820: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20   Commands       
6830: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
6840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
6850: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68  -----. *. * Ciph
68a0: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  ersObjCmd -- lis
68b0: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
68c0: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ers. *. *.This p
68d0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
68e0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
68f0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  he "tls::ciphers
6900: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
6910: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6920: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70  iphers, based up
6930: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  on protocol sele
6940: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cted.. *. * Resu
6950: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6960: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
6970: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
6980: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
6990: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f  ructs and destro
69a0: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ys SSL context (
69b0: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6a00: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6a10: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d  har *protocols[]
6a20: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73   = {.."ssl2", "s
6a30: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
6a40: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
6a50: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
6a60: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
6a70: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
6a80: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
6a90: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
6aa0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
6ab0: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
6ac0: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
6ad0: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
6ae0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6af0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6b00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6b10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
6b20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
6b30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
6b40: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
6b50: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
6b60: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
6b70: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
6b80: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
6b90: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a   *sk;.    char *
6ba0: 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b  cp, buf[BUFSIZ];
6bb0: 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20  .    int index, 
6bc0: 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65  verbose = 0, use
6bd0: 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a  _supported = 0;.
6be0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
6bf0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
6c00: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
6c10: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
6c20: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6c30: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6c40: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
6c50: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
6c60: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
6c70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6c80: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
6c90: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
6ca0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
6cb0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
6cc0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
6cd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6ce0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6cf0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
6d00: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
6d10: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
6d20: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
6d30: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
6d40: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
6d50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6d60: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
6d70: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
6d80: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
6d90: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
6da0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
6db0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6dc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6dd0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
6de0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
6df0: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
6e00: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
6e10: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
6e20: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
6e30: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
6e40: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
6e50: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
6e60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6e70: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
6e80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6e90: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
6ea0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
6eb0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
6ec0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
6ed0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6ee0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
6ef0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53   = SSL_CTX_new(S
6f00: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20  SLv2_method()); 
6f10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
6f20: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69  ase TLS_SSL3:.#i
6f30: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
6f40: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
6f50: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c  ENSSL_NO_SSL3) |
6f60: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
6f70: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
6f80: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
6f90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6fa0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
6fb0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
6fc0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
6fd0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
6fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
6ff0: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c  e..    ctx = SSL
7000: 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d  _CTX_new(SSLv3_m
7010: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
7020: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7030: 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69  S_TLS1:.#if defi
7040: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
7050: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7060: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
7070: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7080: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  LS1_METHOD)..   
7090: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
70a0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
70b0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
70c0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
70d0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
70e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
70f0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
7100: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
7110: 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28  ew(TLSv1_method(
7120: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  )); break;.#endi
7130: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7140: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _1:.#if defined(
7150: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
7160: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7170: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
7180: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7190: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_1_METHOD).. 
71a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
71b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
71c0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
71d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
71e0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
71f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7200: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7210: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7220: 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74  _new(TLSv1_1_met
7230: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
7240: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7250: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69  TLS1_2:.#if defi
7260: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
7270: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7280: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  L_NO_TLS1_2) || 
7290: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
72a0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
72b0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
72c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
72d0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
72e0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
72f0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7300: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7310: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7320: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c  e..    ctx = SSL
7330: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32  _CTX_new(TLSv1_2
7340: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61  _method()); brea
7350: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
7360: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20  TLS_TLS1_3:.#if 
7370: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7380: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
7390: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
73a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
73b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
73c0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
73d0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
73e0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
73f0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
7400: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7410: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7420: 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68  CTX_new(TLS_meth
7430: 6f 64 28 29 29 3b 0a 09 20 20 20 20 53 53 4c 5f  od());..    SSL_
7440: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
7450: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
7460: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7470: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
7480: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
7490: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
74a0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72  ERSION);..    br
74b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  eak;.#endif..def
74c0: 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b  ault:..    break
74d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
74e0: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx == NULL) {..
74f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7500: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28  (interp, REASON(
7510: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ), NULL);..retur
7520: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7530: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53   }..    ssl = SS
7540: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20  L_new(ctx);.    
7550: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
7560: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7570: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41  sult(interp, REA
7580: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53  SON(), NULL);..S
7590: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
75a0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
75b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
75c0: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20  /* Use list and 
75d0: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62  order as would b
75e0: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65  e sent in a Clie
75f0: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61  ntHello or all a
7600: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
7610: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f   */.    if (use_
7620: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b  supported) {..sk
7630: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70   = SSL_get1_supp
7640: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73  orted_ciphers(ss
7650: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
7660: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63  ..sk = SSL_get_c
7670: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
7680: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21   }..    if (sk !
7690: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21  = NULL) {..if (!
76a0: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20  verbose) {..    
76b0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
76c0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
76d0: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
76e0: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
76f0: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
7700: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
7710: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
7720: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
7730: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
7740: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
7750: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
7760: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
7770: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
7780: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
7790: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
77a0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
77b0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
77c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
77d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
77e0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
77f0: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20  1));..    }...} 
7800: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50  else {..    objP
7810: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
7820: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20  ngObj("",0);..  
7830: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
7840: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50  ; i < sk_SSL_CIP
7850: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b  HER_num(sk); i++
7860: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f  ) {...const SSL_
7870: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53  CIPHER *c = sk_S
7880: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
7890: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20  sk, i);...if (c 
78a0: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75  == NULL) continu
78b0: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c  e;..../* textual
78c0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
78d0: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09  the cipher */...
78e0: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
78f0: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75  escription(c, bu
7900: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
7910: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  != NULL) {...   
7920: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
7930: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69  (objPtr, buf, (i
7940: 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29  nt) strlen(buf))
7950: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
7960: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f     Tcl_AppendToO
7970: 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e  bj(objPtr, "UNKN
7980: 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a  OWN\n", 8);...}.
7990: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75  .    }..}..if (u
79a0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
79b0: 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48  .    sk_SSL_CIPH
79c0: 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a  ER_free(sk);..}.
79d0: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72      }.    SSL_fr
79e0: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c  ee(ssl);.    SSL
79f0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
7a00: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
7a10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
7a20: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
7a30: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
7a40: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
7a50: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7aa0: 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73  . *. * Protocols
7ab0: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61  ObjCmd -- list a
7ac0: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f  vailable protoco
7ad0: 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  ls. *. *.This pr
7ae0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
7af0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
7b00: 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c  e "tls::protocol
7b10: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
7b20: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
7b30: 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a  protocols.. *. *
7b40: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
7b50: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
7b60: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
7b70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
7b80: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f  /.static int.Pro
7be0: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69  tocolsObjCmd(Cli
7bf0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
7c00: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
7c10: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
7c20: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
7c30: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
7c40: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
7c50: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7c60: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
7c70: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54  (objc != 1) {..T
7c80: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7c90: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7ca0: 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43   "");..return TC
7cb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7cc0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
7cd0: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50  ror();..    objP
7ce0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
7cf0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23  Obj(0, NULL);..#
7d00: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
7d10: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
7d20: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
7d30: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
7d40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
7d50: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63  _NO_SSL2).    Tc
7d60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7d70: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7d80: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7d90: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
7da0: 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29  s[TLS_SSL2], -1)
7db0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
7dc0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
7dd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7de0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
7df0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
7e00: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7e10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
7e20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
7e30: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
7e40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
7e50: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c  rotocols[TLS_SSL
7e60: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
7e70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7e80: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
7e90: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7ea0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
7eb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7ec0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
7ed0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7ee0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
7ef0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
7f00: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
7f10: 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b  TLS_TLS1], -1));
7f20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
7f30: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
7f40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7f50: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
7f60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
7f70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
7f80: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
7f90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
7fa0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
7fb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
7fc0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
7fd0: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_1], -1));.
7fe0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
7ff0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
8000: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8010: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
8020: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8030: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
8040: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
8050: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
8060: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
8070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
8080: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
8090: 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_2], -1));.#
80a0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
80b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
80c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
80d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
80e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
80f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8100: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8110: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8120: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d  cols[TLS_TLS1_3]
8130: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  , -1));.#endif..
8140: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
8150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
8160: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
8170: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
8180: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
8190: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
81e0: 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f   *. * HandshakeO
81f0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
8200: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
8210: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68  sed to verify wh
8220: 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68  ether the handsh
8230: 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a  ake is complete.
8240: 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a   *.or not.. *. *
8250: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
8260: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
8270: 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64  lt. 1 means hand
8280: 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20  shake complete, 
8290: 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e  0 means pending.
82a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
82b0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63  cts:. *.May forc
82c0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
82d0: 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e  n to take place.
82e0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
82f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8330: 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61  atic int Handsha
8340: 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  keObjCmd(ClientD
8350: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
8360: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8370: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
8380: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
8390: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
83a0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20  hannel chan;    
83b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e      /* The chann
83c0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
83d0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
83e0: 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20  e *statePtr;    
83f0: 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74      /* client st
8400: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
8410: 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  et */.    const 
8420: 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e  char *errStr = N
8430: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
8440: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72   = 1;.    int er
8450: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
8460: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
8470: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
8480: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
8490: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
84a0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
84b0: 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ");..return(TCL_
84c0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
84d0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
84e0: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20  or();..    chan 
84f0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
8500: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
8510: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8520: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55  jv[1], NULL), NU
8530: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
8540: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
8550: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
8560: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8570: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
8580: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
8590: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
85a0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
85b0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
85c0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
85d0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
85e0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
85f0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
8600: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
8610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8620: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
8630: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
8640: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
8650: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54      "\": not a T
8660: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
8670: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
8680: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
8690: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
86a0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
86b0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
86c0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
86d0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
86e0: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
86f0: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
8700: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
8710: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
8720: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
8730: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
8740: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20  nect");.    ret 
8750: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
8760: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
8770: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72  err, 1);.    dpr
8780: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f  intf("Tls_WaitFo
8790: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65  rConnect returne
87a0: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20  d: %i", ret);.. 
87b0: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26     if (ret < 0 &
87c0: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  & ((statePtr->fl
87d0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
87e0: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20  YNC) && (err == 
87f0: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72  EAGAIN))) {..dpr
8800: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20  intf("Async set 
8810: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e  and err = EAGAIN
8820: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20  ");..ret = 0;.  
8830: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74    } else if (ret
8840: 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20   < 0) {..errStr 
8850: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b  = statePtr->err;
8860: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c  ..Tcl_ResetResul
8870: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f  t(interp);..Tcl_
8880: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a  SetErrno(err);..
8890: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20  .if (!errStr || 
88a0: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20  (*errStr == 0)) 
88b0: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20  {..    errStr = 
88c0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
88d0: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c  nterp);..}...Tcl
88e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
88f0: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65  terp, "handshake
8900: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53   failed: ", errS
8910: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  tr, (char *) NUL
8920: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
8930: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
8940: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
8950: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
8960: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72  r *) NULL);..dpr
8970: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
8980: 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68  TCL_ERROR with h
8990: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a  andshake failed:
89a0: 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09   %s", errStr);..
89b0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
89c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
89d0: 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b  .if (err != 0) {
89e0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47  ..    dprintf("G
89f0: 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68  ot an error with
8a00: 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e   a completed han
8a10: 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69  dshake: err = %i
8a20: 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74  ", err);..}..ret
8a30: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
8a40: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
8a50: 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20  ing TCL_OK with 
8a60: 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65  data \"%i\"", re
8a70: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  t);.    Tcl_SetO
8a80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
8a90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
8aa0: 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  et));.    return
8ab0: 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e  (TCL_OK);..clien
8ac0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
8ad0: 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ta;.}../*. *----
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8b20: 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43   *. * ImportObjC
8b30: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
8b40: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
8b50: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
8b60: 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61   the "ssl" comma
8b70: 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c  nd. *. *.The ssl
8b80: 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20   command pushes 
8b90: 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c  SSL over a (newl
8ba0: 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70  y connected) tcp
8bb0: 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65   socket. *. * Re
8bc0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
8bd0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
8be0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
8bf0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
8c00: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
8c10: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
8c20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
8c70: 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74  tatic int.Import
8c80: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
8c90: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
8ca0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8cb0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
8cc0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8cd0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
8ce0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
8cf0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
8d00: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
8d10: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
8d20: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20  Ptr;../* client 
8d30: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
8d40: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
8d50: 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20  CTX *ctx.       
8d60: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
8d70: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20  _Obj *script.   
8d80: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
8d90: 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f   Tcl_Obj *passwo
8da0: 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rd.        = NUL
8db0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
8dc0: 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e  vcmd.        = N
8dd0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
8de0: 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65  ring upperChanne
8df0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70  lTranslation, up
8e00: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
8e10: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ng, upperChannel
8e20: 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43  Encoding, upperC
8e30: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20  hannelEOFChar;. 
8e40: 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b     int idx, len;
8e50: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09  .    int flags..
8e60: 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43          = TLS_TC
8e70: 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20  L_INIT;.    int 
8e80: 73 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20  server..        
8e90: 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65  = 0;./* is conne
8ea0: 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f  ction incoming o
8eb0: 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20  r outgoing? */. 
8ec0: 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65     char *keyfile
8ed0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8ee0: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66  .    char *certf
8ef0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
8f00: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  LL;.    unsigned
8f10: 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e   char *key  .= N
8f20: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79  ULL;.    int key
8f30: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  _len            
8f40: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e       = 0;.    un
8f50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
8f60: 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t         = NULL
8f70: 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c  ;.    int cert_l
8f80: 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  en              
8f90: 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20    = 0;.    char 
8fa0: 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20  *ciphers.       
8fb0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
8fc0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09  r *ciphersuites.
8fd0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
8fe0: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
8ff0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9000: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72  .    char *CAdir
9010: 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  ..        = NULL
9020: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61  ;.    char *DHpa
9030: 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e  rams.        = N
9040: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d  ULL;.    char *m
9050: 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20  odel..        = 
9060: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9070: 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20  servername.     
9080: 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f     = NULL;./* ho
9090: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65  stname for Serve
90a0: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f  r Name Indicatio
90b0: 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  n */.    const u
90c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
90d0: 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b  ssion_id = NULL;
90e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c  .    Tcl_Obj *al
90f0: 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  pn..= NULL;.    
9100: 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73  int ssl2 = 0, ss
9110: 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  l3 = 0;.    int 
9120: 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31  tls1 = 1, tls1_1
9130: 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31   = 1, tls1_2 = 1
9140: 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20  , tls1_3 = 1;.  
9150: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c    int proto = 0,
9160: 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20   level = -1;.   
9170: 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c   int verify = 0,
9180: 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65   require = 0, re
9190: 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f  quest = 1, post_
91a0: 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a  handshake = 0;..
91b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
91c0: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  led");..#if OPEN
91d0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
91e0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
91f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
9200: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26  NSSL_NO_SSL2) &&
9210: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
9220: 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  2) && defined(NO
9230: 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65  _SSL3) && define
9240: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65  d(NO_TLS1) && de
9250: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
9260: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54   && defined(NO_T
9270: 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65  LS1_2) && define
9280: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  d(NO_TLS1_3).   
9290: 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69   ssl2 = 1;.#endi
92a0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f  f.#if !defined(O
92b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
92c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
92d0: 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28  SL3) && defined(
92e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69  NO_SSL2) && defi
92f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
9300: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
9310: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  1) && defined(NO
9320: 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69  _TLS1_2) && defi
9330: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  ned(NO_TLS1_3). 
9340: 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e     ssl3 = 1;.#en
9350: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
9360: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
9370: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9380: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
9390: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
93a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
93b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
93c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
93d0: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23     tls1_1 = 0;.#
93e0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
93f0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
9400: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9410: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74  NO_TLS1_2).    t
9420: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_2 = 0;.#endi
9430: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
9440: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
9450: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9460: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_3).    tls1_
9470: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  3 = 0;.#endif.. 
9480: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
9490: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
94a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
94b0: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f  objv, "channel ?
94c0: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74  options?");..ret
94d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
94e0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
94f0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
9500: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9510: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
9520: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9530: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
9540: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
9550: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
9560: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
9570: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
9580: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
9590: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
95a0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
95b0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
95c0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
95d0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
95e0: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28  han);..    for (
95f0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f  idx = 2; idx < o
9600: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63  bjc; idx++) {..c
9610: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47  har *opt = Tcl_G
9620: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9630: 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29  objv[idx], NULL)
9640: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21  ;...if (opt[0] !
9650: 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61  = '-')..    brea
9660: 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c  k;...OPTOBJ("-al
9670: 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54  pn", alpn);..OPT
9680: 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41  STR("-cadir", CA
9690: 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  dir);..OPTSTR("-
96a0: 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29  cafile", CAfile)
96b0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72  ;..OPTBYTE("-cer
96c0: 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c  t", cert, cert_l
96d0: 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  en);..OPTSTR("-c
96e0: 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69  ertfile", certfi
96f0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  le);..OPTSTR("-c
9700: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29  ipher", ciphers)
9710: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9720: 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  ers", ciphers);.
9730: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9740: 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73  suites", ciphers
9750: 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28  uites);..OPTOBJ(
9760: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69  "-command", scri
9770: 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64  pt);..OPTSTR("-d
9780: 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61  hparams", DHpara
9790: 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  ms);..OPTBYTE("-
97a0: 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c  key", key, key_l
97b0: 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b  en);..OPTSTR("-k
97c0: 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65  eyfile", keyfile
97d0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64  );..OPTSTR("-mod
97e0: 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50  el", model);..OP
97f0: 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22  TOBJ("-password"
9800: 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50  , password);..OP
9810: 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e  TBOOL("-post_han
9820: 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61  dshake", post_ha
9830: 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f  ndshake);..OPTBO
9840: 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72  OL("-request", r
9850: 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f  equest);..OPTBOO
9860: 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65  L("-require", re
9870: 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28  quire);..OPTINT(
9880: 22 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22  "-securitylevel"
9890: 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f  , level);..OPTBO
98a0: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65  OL("-server", se
98b0: 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22  rver);..OPTSTR("
98c0: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65  -servername", se
98d0: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53  rvername);..OPTS
98e0: 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22  TR("-session_id"
98f0: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09  , session_id);..
9900: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c  OPTBOOL("-ssl2",
9910: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl2);..OPTBOOL
9920: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b  ("-ssl3", ssl3);
9930: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9940: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f  ", tls1);..OPTBO
9950: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c  OL("-tls1.1", tl
9960: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_1);..OPTBOOL(
9970: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f  "-tls1.2", tls1_
9980: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  2);..OPTBOOL("-t
9990: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b  ls1.3", tls1_3);
99a0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64  ..OPTOBJ("-valid
99b0: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d  atecommand", vcm
99c0: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63  d);..OPTOBJ("-vc
99d0: 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50  md", vcmd);...OP
99e0: 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22  TBAD("option", "
99f0: 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d  -alpn, -cadir, -
9a00: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d  cafile, -cert, -
9a10: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65  certfile, -ciphe
9a20: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73  r, -ciphersuites
9a30: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70  , -command, -dhp
9a40: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65  arams, -key, -ke
9a50: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d  yfile, -model, -
9a60: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f  password, -post_
9a70: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75  handshake, -requ
9a80: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d  est, -require, -
9a90: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d  securitylevel, -
9aa0: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e  server, -servern
9ab0: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64  ame, -session_id
9ac0: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
9ad0: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
9ae0: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33  -tls1.2, -tls1.3
9af0: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f  , or -validateco
9b00: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72  mmand");...retur
9b10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9b20: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
9b30: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53  st)..verify |= S
9b40: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
9b50: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
9b60: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
9b70: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
9b80: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ire).verify |= S
9b90: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
9ba0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
9bb0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
9bc0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
9bd0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
9be0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
9bf0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28  DSHAKE;.    if (
9c00: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65  verify == 0)..ve
9c10: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46  rify = SSL_VERIF
9c20: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f  Y_NONE;..    pro
9c30: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c  to |= (ssl2 ? TL
9c40: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30  S_PROTO_SSL2 : 0
9c50: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
9c60: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl3 ? TLS_PROT
9c70: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20  O_SSL3 : 0);.   
9c80: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20   proto |= (tls1 
9c90: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
9ca0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
9cb0: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c   |= (tls1_1 ? TL
9cc0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a  S_PROTO_TLS1_1 :
9cd0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
9ce0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f  = (tls1_2 ? TLS_
9cf0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30  PROTO_TLS1_2 : 0
9d00: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
9d10: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52  (tls1_3 ? TLS_PR
9d20: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b  OTO_TLS1_3 : 0);
9d30: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74  ..    /* reset t
9d40: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20  o NULL if blank 
9d50: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20  string provided 
9d60: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
9d70: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20  && !*cert)..    
9d80: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20      cert.       
9d90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
9da0: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09  (key && !*key)..
9db0: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20          key.    
9dc0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9dd0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20  if (certfile && 
9de0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20  !*certfile)     
9df0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e      certfile.= N
9e00: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
9e10: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c  file && !*keyfil
9e20: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20  e)..keyfile.    
9e30: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9e40: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21  if (ciphers && !
9e50: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20  *ciphers).      
9e60: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20    ciphers.      
9e70: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9e80: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26   (ciphersuites &
9e90: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73  & !*ciphersuites
9ea0: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20  ) ciphersuites  
9eb0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9ec0: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
9ed0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41  file).        CA
9ee0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
9ef0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64  ULL;.    if (CAd
9f00: 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20  ir && !*CAdir). 
9f10: 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20         CAdir.   
9f20: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9f30: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26   if (DHparams &&
9f40: 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20   !*DHparams).   
9f50: 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20       DHparams   
9f60: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20       = NULL;..  
9f70: 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61    /* new SSL sta
9f80: 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  te */.    stateP
9f90: 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20  tr..= (State *) 
9fa0: 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65  ckalloc((unsigne
9fb0: 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29  d) sizeof(State)
9fc0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74  );.    memset(st
9fd0: 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f  atePtr, 0, sizeo
9fe0: 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20  f(State));..    
9ff0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09  statePtr->flags.
a000: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61  = flags;.    sta
a010: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20  tePtr->interp.= 
a020: 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74  interp;.    stat
a030: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76  ePtr->vflags.= v
a040: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65  erify;.    state
a050: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a  Ptr->err.= "";..
a060: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
a070: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66  script */.    if
a080: 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f   (script) {..(vo
a090: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a0a0: 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c  gFromObj(script,
a0b0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a0c0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a0d0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63  r->callback = sc
a0e0: 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49  ript;..    Tcl_I
a0f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
a100: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
a110: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a120: 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77  * allocate passw
a130: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ord */.    if (p
a140: 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69  assword) {..(voi
a150: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a160: 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64  FromObj(password
a170: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
a180: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  n) {..    stateP
a190: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70  tr->password = p
a1a0: 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63  assword;..    Tc
a1b0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a1c0: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
a1d0: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
a1e0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61    /* allocate va
a1f0: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a  lidate command *
a200: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20  /.    if (vcmd) 
a210: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a220: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76  tStringFromObj(v
a230: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  cmd, &len);..if 
a240: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a250: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63  tePtr->vcmd = vc
a260: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  md;..    Tcl_Inc
a270: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a280: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20  tr->vcmd);..}.  
a290: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64    }..    if (mod
a2a0: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  el != NULL) {..i
a2b0: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74  nt mode;../* Get
a2c0: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e   the "model" con
a2d0: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  text */..chan = 
a2e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
a2f0: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d  nterp, model, &m
a300: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20  ode);..if (chan 
a310: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
a320: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
a330: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
a340: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
a350: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a360: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61  ;..}.../*.. * Ma
a370: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
a380: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
a390: 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09  t channel.. */..
a3a0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
a3b0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
a3c0: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e  .if (Tcl_GetChan
a3d0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
a3e0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
a3f0: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  ()) {..    Tcl_A
a400: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a410: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
a420: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
a430: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
a440: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
a450: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
a460: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
a470: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
a480: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
a490: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
a4a0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
a4b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
a4c0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a4d0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a4e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a4f0: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74  .}..ctx = ((Stat
a500: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
a510: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
a520: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20  han))->ctx;.    
a530: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63  } else {..if ((c
a540: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74  tx = CTX_Init(st
a550: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20  atePtr, server, 
a560: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20  proto, keyfile, 
a570: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63  certfile, key, c
a580: 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20  ert, key_len,.. 
a590: 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64     cert_len, CAd
a5a0: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
a5b0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
a5c0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
a5d0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
a5e0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a5f0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a600: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a610: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
a620: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
a630: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
a640: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
a650: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
a660: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
a670: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
a680: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
a690: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
a6a0: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
a6b0: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
a6c0: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
a6d0: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
a6e0: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
a6f0: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
a700: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
a710: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
a720: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
a730: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
a740: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
a750: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
a760: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
a770: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a780: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
a790: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
a7a0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
a7b0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
a7c0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
a7d0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a7e0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
a7f0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
a800: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
a810: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
a820: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
a830: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
a840: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
a850: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
a860: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
a870: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
a880: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
a890: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
a8a0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
a8b0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
a8c0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
a8d0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
a8e0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
a8f0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
a900: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
a910: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
a920: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
a930: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
a940: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
a950: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
a960: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
a970: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
a980: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
a990: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
a9a0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
a9b0: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
a9c0: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
a9d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
a9e0: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
a9f0: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
aa00: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
aa10: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
aa20: 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61  ype(), (ClientDa
aa30: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54  ta) statePtr, (T
aa40: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
aa50: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
aa60: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
aa70: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
aa80: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
aa90: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
aaa0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
aab0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
aac0: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
aad0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
aae0: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
aaf0: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
ab00: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
ab10: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
ab20: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
ab30: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
ab40: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
ab50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ab60: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
ab70: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ab80: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
ab90: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
aba0: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
abb0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
abc0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
abd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
abe0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
abf0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
ac00: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
ac10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
ac20: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
ac30: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
ac40: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
ac50: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
ac60: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
ac70: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
ac80: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ac90: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
aca0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
acb0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
acc0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
acd0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
ace0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
acf0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
ad00: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a  cking));..    /*
ad10: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
ad20: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
ad30: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
ad40: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
ad50: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
ad60: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
ad70: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
ad80: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
ad90: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
ada0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
adb0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
adc0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
add0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
ade0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
adf0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
ae00: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
ae10: 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c  IMPORT", "INIT",
ae20: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
ae30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f   *) NULL);..Tls_
ae40: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
ae50: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
ae60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ae70: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f  }..    /* Set ho
ae80: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a  st server name *
ae90: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  /.    if (server
aea0: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73  name) {../* Sets
aeb0: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65   the server name
aec0: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49   indication (SNI
aed0: 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  ) in ClientHello
aee0: 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f   extension */../
aef0: 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20  * Per RFC 6066, 
af00: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53  hostname is a AS
af10: 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69  CII encoded stri
af20: 6e 67 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  ng. */..if (!SSL
af30: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
af40: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
af50: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
af60: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
af70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
af80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65  sult(interp, "se
af90: 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e  tting TLS host n
afa0: 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61  ame extension fa
afb0: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  iled", (char *) 
afc0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
afd0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
afe0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
aff0: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41  ORT", "SNI", "FA
b000: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b010: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b020: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b030: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b050: 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72  .}.../* Configur
b060: 65 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61  e server host na
b070: 6d 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65  me checks in the
b080: 20 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74   SSL client. Set
b090: 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f   DNS hostname to
b0a0: 0a 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65  ..   name for pe
b0b0: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63  er certificate c
b0c0: 68 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f  hecks. SSL_set1_
b0d0: 68 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74  host has limitat
b0e0: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53  ions. */..if (!S
b0f0: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61  SL_add1_host(sta
b100: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
b110: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20  ername)) {..    
b120: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b130: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e  (interp, "settin
b140: 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20  g DNS host name 
b150: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a  failed", (char *
b160: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
b170: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b180: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b190: 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d  MPORT", "HOSTNAM
b1a0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  E", "FAILED", (c
b1b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b1c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
b1d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b1e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b1f0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
b200: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73  .    /* Resume s
b210: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  ession id */.   
b220: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20   if (session_id 
b230: 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f  && strlen(sessio
b240: 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58  n_id) <= SSL_MAX
b250: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29  _SID_CTX_LENGTH)
b260: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
b270: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20  ession() */..if 
b280: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65  (!SSL_SESSION_se
b290: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53  t1_id_context(SS
b2a0: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74  L_get_session(st
b2b0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65  atePtr->ssl), se
b2c0: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67  ssion_id, (unsig
b2d0: 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28  ned int) strlen(
b2e0: 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a  session_id))) {.
b2f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b300: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52  esult(interp, "R
b310: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64  esume session id
b320: 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20   ", session_id, 
b330: 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72  " failed", (char
b340: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b350: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b360: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b370: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49  "IMPORT", "SESSI
b380: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ON", "FAILED", (
b390: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  char *) NULL);. 
b3a0: 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46             Tls_F
b3b0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b3c0: 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  tePtr);.        
b3d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b3e0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b3f0: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a      if (alpn) {.
b400: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43  ./* Convert a TC
b410: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72  L list into a pr
b420: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77  otocol-list in w
b430: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75  ire-format */..u
b440: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
b450: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67  otos, *p;..unsig
b460: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c  ned int protos_l
b470: 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20  en = 0;..int i, 
b480: 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f  len, cnt;..Tcl_O
b490: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20  bj **list;...if 
b4a0: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45  (Tcl_ListObjGetE
b4b0: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
b4c0: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73  alpn, &cnt, &lis
b4d0: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  t) != TCL_OK) {.
b4e0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
b4f0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b500: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b510: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
b520: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d   Determine the m
b530: 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66  emory required f
b540: 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d  or the protocol-
b550: 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20  list */..for (i 
b560: 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b  = 0; i < cnt; i+
b570: 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65  +) {..    Tcl_Ge
b580: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c  tStringFromObj(l
b590: 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09  ist[i], &len);..
b5a0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35      if (len > 25
b5b0: 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  5) {...Tcl_Appen
b5c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b5d0: 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e  "ALPN protocol n
b5e0: 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28  ame too long", (
b5f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b600: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
b610: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b620: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
b630: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b640: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
b650: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b660: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65   statePtr);...re
b670: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b680: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74  .    }..    prot
b690: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65  os_len += 1 + le
b6a0: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64  n;..}.../* Build
b6b0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72   the complete pr
b6c0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
b6d0: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63  protos = ckalloc
b6e0: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f  (protos_len);../
b6f0: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73  * protocol-lists
b700: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69   consist of 8-bi
b710: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65  t length-prefixe
b720: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20  d, byte strings 
b730: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20  */..for (i = 0, 
b740: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20  p = protos; i < 
b750: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
b760: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c   char *str = Tcl
b770: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
b780: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29  j(list[i], &len)
b790: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65  ;..    *p++ = le
b7a0: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70  n;..    memcpy(p
b7b0: 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20  , str, len);..  
b7c0: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a    p += len;..}..
b7d0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  ./* SSL_set_alpn
b7e0: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20  _protos makes a 
b7f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74  copy of the prot
b800: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a  ocol-list */../*
b810: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63   Note: This func
b820: 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74  tions reverses t
b830: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
b840: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69  convention */..i
b850: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  f (SSL_set_alpn_
b860: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d  protos(statePtr-
b870: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72  >ssl, protos, pr
b880: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20  otos_len)) {..  
b890: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b8a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c  lt(interp, "fail
b8b0: 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70  ed to set ALPN p
b8c0: 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72  rotocols", (char
b8d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b8e0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b8f0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b900: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
b910: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b920: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b930: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
b940: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
b950: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73     ckfree(protos
b960: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b970: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
b980: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c  * Store protocol
b990: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65  s list */..state
b9a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72  Ptr->protos = pr
b9b0: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d  otos;..statePtr-
b9c0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72  >protos_len = pr
b9d0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
b9e0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
b9f0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
ba00: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
ba10: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  os_len = 0;.    
ba20: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
ba30: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20   SSL Callbacks. 
ba40: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73      */.    SSL_s
ba50: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74  et_app_data(stat
ba60: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
ba70: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a   *)statePtr);./*
ba80: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75   point back to u
ba90: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  s */.    SSL_set
baa0: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72  _verify(statePtr
bab0: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56  ->ssl, verify, V
bac0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a  erifyCallback);.
bad0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f      SSL_set_info
bae0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
baf0: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c  tr->ssl, InfoCal
bb00: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
bb10: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73  Callback for obs
bb20: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  erving protocol 
bb30: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e  messages */.#ifn
bb40: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
bb50: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20  SL_TRACE.    /* 
bb60: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74  void SSL_CTX_set
bb70: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
bb80: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
bb90: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
bba0: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c  r);.    void SSL
bbb0: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c  _CTX_set_msg_cal
bbc0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
bbd0: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ctx, MessageCall
bbe0: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53  back); */.    SS
bbf0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
bc00: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
bc10: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
bc20: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c  atePtr);.    SSL
bc30: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
bc40: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  k(statePtr->ssl,
bc50: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
bc60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
bc70: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61  * Create Tcl_Cha
bc80: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72  nnel BIO Handler
bc90: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
bca0: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  ->p_bio.= BIO_ne
bcb0: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20  w_tcl(statePtr, 
bcc0: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20  BIO_NOCLOSE);.  
bcd0: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09    statePtr->bio.
bce0: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f  = BIO_new(BIO_f_
bcf0: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20  ssl());..    if 
bd00: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53  (server) {../* S
bd10: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  erver callbacks 
bd20: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
bd30: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
bd40: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  e_arg(statePtr->
bd50: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
bd60: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58  tePtr);..SSL_CTX
bd70: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
bd80: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28  ername_callback(
bd90: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
bda0: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53  NICallback);..SS
bdb0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
bdc0: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50  _hello_cb(stateP
bdd0: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61  tr->ctx, HelloCa
bde0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
bdf0: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28  statePtr);..if (
be00: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
be10: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
be20: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70   SSL_CTX_set_alp
be30: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
be40: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
be50: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
be60: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64  )statePtr);.#ifd
be70: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20  ef USE_NPN..    
be80: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20  if (tls1_2 == 0 
be90: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
bea0: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  {...SSL_CTX_set_
beb0: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65  next_protos_adve
bec0: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50  rtised_cb(stateP
bed0: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c  tr->ctx, NPNCall
bee0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
bef0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a  atePtr);..    }.
bf00: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45  #endif..}.../* E
bf10: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20  nable server to 
bf20: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73  send cert reques
bf30: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b  t after handshak
bf40: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29  e (TLS 1.3 only)
bf50: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20   */../* A write 
bf60: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74  operation must t
bf70: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68  ake place for th
bf80: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65  e Certificate Re
bf90: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20  quest to be..   
bfa0: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65  sent to the clie
bfb0: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20  nt, this can be 
bfc0: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f  done with SSL_do
bfd0: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f  _handshake(). */
bfe0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
bff0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
c000: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69   {..    SSL_veri
c010: 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68  fy_client_post_h
c020: 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74  andshake(statePt
c030: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a  r->ssl);..}.../*
c040: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65   Set server mode
c050: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66   */..statePtr->f
c060: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
c070: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74  SERVER;..SSL_set
c080: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74  _accept_state(st
c090: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
c0a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43    } else {../* C
c0b0: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20  lient callbacks 
c0c0: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
c0d0: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  N..if (statePtr-
c0e0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20  >protos != NULL 
c0f0: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  && tls1_2 == 0 &
c100: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c110: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
c120: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c  t_next_proto_sel
c130: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c140: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c150: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c160: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  ePtr);..}.#endif
c170: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61  .../* Session ca
c180: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54  ching */..SSL_CT
c190: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_set_session_ca
c1a0: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
c1b0: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53  r->ctx, SSL_SESS
c1c0: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20  _CACHE_CLIENT | 
c1d0: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e  SSL_SESS_CACHE_N
c1e0: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45  O_INTERNAL_STORE
c1f0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73  );..SSL_CTX_sess
c200: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74  _set_new_cb(stat
c210: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69  ePtr->ctx, Sessi
c220: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f  onCallback);.../
c230: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61  * Enable post ha
c240: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69  ndshake Authenti
c250: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e  cation extension
c260: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20  . TLS 1.3 only, 
c270: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09  not http/2. */..
c280: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
c290: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b  ost_handshake) {
c2a0: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f  ..    SSL_set_po
c2b0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74  st_handshake_aut
c2c0: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  h(statePtr->ssl,
c2d0: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74   1);..}.../* Set
c2e0: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a   client mode */.
c2f0: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74  .SSL_set_connect
c300: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
c310: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
c320: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61   SSL_set_bio(sta
c330: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74  tePtr->ssl, stat
c340: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61  ePtr->p_bio, sta
c350: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20  tePtr->p_bio);. 
c360: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73     BIO_set_ssl(s
c370: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74  tatePtr->bio, st
c380: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f  atePtr->ssl, BIO
c390: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20  _NOCLOSE);..    
c3a0: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66  /*.     * End of
c3b0: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a   SSL Init.     *
c3c0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  /.    dprintf("R
c3d0: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63  eturning %s", Tc
c3e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
c3f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
c400: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  );.    Tcl_SetRe
c410: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
c420: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  ar *) Tcl_GetCha
c430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
c440: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f  r->self), TCL_VO
c450: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65  LATILE);..    re
c460: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
c470: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
c480: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
c490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f  ---. *. * Unimpo
c4e0: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
c4f0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
c500: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
c510: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73  emove the topmos
c520: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72  t channel filter
c530: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
c540: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
c550: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
c560: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
c570: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
c580: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
c590: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
c5a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
c5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
c5f0: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  int.UnimportObjC
c600: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
c610: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
c620: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
c630: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
c640: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
c650: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
c660: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
c670: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
c680: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20  mode on. */..   
c690: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
c6a0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
c6b0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
c6c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c6d0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
c6e0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
c6f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c700: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
c710: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
c720: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
c730: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
c740: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
c750: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
c760: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
c770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
c790: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
c7a0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
c7b0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
c7c0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
c7d0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20  hannel(chan);.. 
c7e0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
c7f0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
c800: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
c810: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
c820: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c830: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
c840: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
c850: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
c860: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
c870: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
c880: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
c890: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
c8a0: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c  LS", "UNIMPORT",
c8b0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
c8c0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
c8d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
c8e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
c8f0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
c900: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
c910: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
c920: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
c930: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c940: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
c950: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
c960: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
c970: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
c9c0: 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20  . * CTX_Init -- 
c9d0: 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f  construct a SSL_
c9e0: 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a  CTX instance. *.
c9f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
ca00: 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69   valid SSL_CTX i
ca10: 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e  nstance or NULL.
ca20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
ca30: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63  cts:. *.construc
ca40: 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ts SSL context (
ca50: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
ca60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
caa0: 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58  /.static SSL_CTX
cab0: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74   *.CTX_Init(Stat
cac0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74  e *statePtr, int
cad0: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70   isServer, int p
cae0: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66  roto, char *keyf
caf0: 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66  ile, char *certf
cb00: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65  ile,.    unsigne
cb10: 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73  d char *key, uns
cb20: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
cb30: 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69  , int key_len, i
cb40: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61  nt cert_len, cha
cb50: 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68  r *CAdir,.    ch
cb60: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72  ar *CAfile, char
cb70: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
cb80: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69  *ciphersuites, i
cb90: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a  nt level, char *
cba0: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20  DHparams) {.    
cbb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
cbc0: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp = statePtr->i
cbd0: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43  nterp;.    SSL_C
cbe0: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
cbf0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
cc00: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ds;.    Tcl_DStr
cc10: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74  ing ds1;.    int
cc20: 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e   off = 0;.    in
cc30: 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  t load_private_k
cc40: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  ey;.    const SS
cc50: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64  L_METHOD *method
cc60: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
cc70: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
cc80: 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63  f (!proto) {..Tc
cc90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cca0: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64  nterp, "no valid
ccb0: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
ccc0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
ccd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
cce0: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53  .    /* create S
ccf0: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69  SL context */.#i
cd00: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
cd10: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
cd20: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
cd30: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
cd40: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
cd50: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28  O_SSL2).    if (
cd60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
cd70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20  LS_PROTO_SSL2)) 
cd80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
cd90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
cda0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
cdb0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
cdc0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
cdd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
cde0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
cdf0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
ce00: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
ce10: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
ce20: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
ce30: 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL3)) {..Tcl_App
ce40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ce50: 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c  , "SSL3 protocol
ce60: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
ce70: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
ce80: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
ce90: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
cea0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
ceb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
cec0: 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  S1).    if (ENAB
ced0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
cee0: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54  ROTO_TLS1)) {..T
cef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cf00: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30  interp, "TLS 1.0
cf10: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
cf20: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
cf30: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
cf40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
cf50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
cf60: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
cf70: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
cf80: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
cf90: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cfa0: 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63  O_TLS1_1)) {..Tc
cfb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cfc0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20  nterp, "TLS 1.1 
cfd0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
cfe0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
cff0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d000: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d010: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
d020: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d030: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
d040: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d050: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d060: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c  _TLS1_2)) {..Tcl
d070: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d080: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70  terp, "TLS 1.2 p
d090: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d0a0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
d0b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d0c0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d0d0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
d0e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d0f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
d100: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d110: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d120: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_3)) {..Tcl_
d130: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d140: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72  erp, "TLS 1.3 pr
d150: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d160: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
d170: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d180: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77  }.#endif..    sw
d190: 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23  itch (proto) {.#
d1a0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
d1b0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
d1c0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
d1d0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
d1e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d1f0: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61  _NO_SSL2).    ca
d200: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  se TLS_PROTO_SSL
d210: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  2:..method = isS
d220: 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65  erver ? SSLv2_se
d230: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
d240: 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  SSLv2_client_met
d250: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d260: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
d270: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
d280: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d290: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
d2a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d2b0: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20  SSL3_METHOD).   
d2c0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d2d0: 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  SSL3:..method = 
d2e0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33  isServer ? SSLv3
d2f0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d300: 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f   : SSLv3_client_
d310: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d320: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d330: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
d340: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d350: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
d360: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d370: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
d380: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d390: 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64  TO_TLS1:..method
d3a0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
d3b0: 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Sv1_server_metho
d3c0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65  d() : TLSv1_clie
d3d0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d3e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d3f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d400: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
d410: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d420: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
d430: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
d440: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
d450: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
d460: 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  _1:..method = is
d470: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31  Server ? TLSv1_1
d480: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d490: 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e   : TLSv1_1_clien
d4a0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d4b0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d4c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d4d0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
d4e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
d4f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d500: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f  ENSSL_NO_TLS1_2_
d510: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
d520: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d530: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  2:..method = isS
d540: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f  erver ? TLSv1_2_
d550: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d560: 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74  : TLSv1_2_client
d570: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d580: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d590: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
d5a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d5b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
d5c0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d5d0: 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20  OTO_TLS1_3:../* 
d5e0: 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20  Use the generic 
d5f0: 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74  method and const
d600: 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65  raint range afte
d610: 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65  r context is cre
d620: 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  ated */..method 
d630: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
d640: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d650: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65   : TLS_client_me
d660: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d670: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
d680: 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74  lt:../* Negotiat
d690: 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61  e highest availa
d6a0: 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73  ble SSL/TLS vers
d6b0: 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d  ion */..method =
d6c0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f   isServer ? TLS_
d6d0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d6e0: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74  : TLS_client_met
d6f0: 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53  hod();.#if OPENS
d700: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
d710: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
d720: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
d730: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
d740: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
d750: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
d760: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d770: 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20  OTO_SSL2)   ? 0 
d780: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
d790: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
d7a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d7b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d7c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f  NSSL_NO_SSL3)..o
d7d0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
d7e0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d7f0: 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL3)   ? 0 : SS
d800: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a  L_OP_NO_SSLv3);.
d810: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d820: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
d830: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d840: 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c  _NO_TLS1)..off |
d850: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
d860: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
d870: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
d880: 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64  _NO_TLSv1);.#end
d890: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d8a0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
d8b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d8c0: 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c  O_TLS1_1)..off |
d8d0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
d8e0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
d8f0: 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _1) ? 0 : SSL_OP
d900: 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65  _NO_TLSv1_1);.#e
d910: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d920: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
d930: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d940: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66  _NO_TLS1_2)..off
d950: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
d960: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d970: 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_2) ? 0 : SSL_
d980: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a  OP_NO_TLSv1_2);.
d990: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d9a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
d9b0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d9c0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f  SL_NO_TLS1_3)..o
d9d0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
d9e0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d9f0: 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53  TLS1_3) ? 0 : SS
da00: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29  L_OP_NO_TLSv1_3)
da10: 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b  ;.#endif..break;
da20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
da30: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
da40: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
da50: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20  X_new(method);. 
da60: 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09     if (!ctx) {..
da70: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20  return(NULL);.  
da80: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74    }..    if (get
da90: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  env(SSLKEYLOGFIL
daa0: 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73  E)) {..SSL_CTX_s
dab0: 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61  et_keylog_callba
dac0: 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61  ck(ctx, KeyLogCa
dad0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a  llback);.    }..
dae0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
daf0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
db00: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
db10: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70  LS1_3).    if (p
db20: 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54  roto == TLS_PROT
db30: 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c  O_TLS1_3) {..SSL
db40: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
db50: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
db60: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
db70: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
db80: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
db90: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
dba0: 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ION);.    }.#end
dbb0: 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65  if..    /* Force
dbc0: 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f   cipher selectio
dbd0: 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65  n order by serve
dbe0: 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73  r */.    if (!is
dbf0: 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43  Server) {..SSL_C
dc00: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
dc10: 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45  tx, SSL_OP_CIPHE
dc20: 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45  R_SERVER_PREFERE
dc30: 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NCE);.    }..   
dc40: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70   SSL_CTX_set_app
dc50: 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  _data(ctx, (void
dc60: 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65  *)interp);./* re
dc70: 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72  member the inter
dc80: 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53  preter */.    SS
dc90: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
dca0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c  s(ctx, SSL_OP_AL
dcb0: 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62  L);./* all SSL b
dcc0: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a  ug workarounds *
dcd0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
dce0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f  t_options(ctx, o
dcf0: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65  ff);../* disable
dd00: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
dd10: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ns */.#if OPENSS
dd20: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
dd30: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   < 0x10101000L. 
dd40: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
dd50: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
dd60: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f  E_AUTO_RETRY);./
dd70: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e  * handle new han
dd80: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67  dshakes in backg
dd90: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66  round. On by def
dda0: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20  ault in OpenSSL 
ddb0: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66  1.1.1. */.#endif
ddc0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
ddd0: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
dde0: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
ddf0: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
de00: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
de10: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
de20: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
de30: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
de40: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
de50: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
de60: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
de70: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
de80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
de90: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
dea0: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
deb0: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
dec0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
ded0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
dee0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
def0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
df00: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
df10: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
df20: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
df30: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
df40: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
df50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
df60: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
df70: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
df80: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
df90: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
dfa0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
dfb0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
dfc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
dfd0: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
dfe0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65   */.    if (leve
dff0: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20  l > -1 && level 
e000: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73  < 6) {../* SSL_s
e010: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
e020: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  l */..SSL_CTX_se
e030: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e040: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20  (ctx, level);.  
e050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
e060: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a  some callbacks *
e070: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
e080: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
e090: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72  _cb(ctx, Passwor
e0a0: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  dCallback);.    
e0b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
e0c0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73  ult_passwd_cb_us
e0d0: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  erdata(ctx, (voi
e0e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a  d *)statePtr);..
e0f0: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69      /* read a Di
e100: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72  ffie-Hellman par
e110: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72  ameters file, or
e120: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   use the built-i
e130: 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20  n one */.#ifdef 
e140: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20  OPENSSL_NO_DH.  
e150: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21    if (DHparams !
e160: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
e170: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e180: 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65  rp, "DH paramete
e190: 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76  r support not av
e1a0: 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20  ailable", (char 
e1b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
e1c0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
e1d0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
e1e0: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44  }.#else.    {..D
e1f0: 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61  H* dh;..if (DHpa
e200: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rams != NULL) {.
e210: 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09  .    BIO *bio;..
e220: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
e230: 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62  nit(&ds);..    b
e240: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c  io = BIO_new_fil
e250: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20  e(F2N(DHparams, 
e260: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20  &ds), "r");..   
e270: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54   if (!bio) {...T
e280: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e290: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  ds);...Tcl_Appen
e2a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e2b0: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20  "Could not find 
e2c0: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69  DH parameters fi
e2d0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
e2e0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
e2f0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
e300: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
e310: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
e320: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
e330: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
e340: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
e350: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
e360: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
e370: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
e380: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
e390: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e3a0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65  p, "Could not re
e3b0: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  ad DH parameters
e3c0: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68   from file", (ch
e3d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
e3e0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e3f0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
e400: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20  ..    }..} else 
e410: 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f  {..    dh = get_
e420: 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09  dhParams();..}..
e430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f  SSL_CTX_set_tmp_
e440: 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48  dh(ctx, dh);..DH
e450: 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d  _free(dh);.    }
e460: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
e470: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63  set our certific
e480: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f  ate */.    load_
e490: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b  private_key = 0;
e4a0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
e4b0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  e != NULL) {..lo
e4c0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
e4d0: 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e   1;...Tcl_DStrin
e4e0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66  gInit(&ds);...if
e4f0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
e500: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
e510: 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65  tx, F2N(certfile
e520: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
e530: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
e540: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
e550: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
e560: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e570: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
e580: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
e590: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
e5a0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
e5b0: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20  .     REASON(), 
e5c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e5d0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
e5e0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
e5f0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20  urn NULL;..}.   
e600: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74   } else if (cert
e610: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
e620: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
e630: 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  1;..if (SSL_CTX_
e640: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
e650: 41 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c  ASN1(ctx, cert_l
e660: 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20  en, cert) <= 0) 
e670: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
e680: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
e690: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e6a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
e6b0: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
e6c0: 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20  icate: ",....   
e6d0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
e6e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
e6f0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
e700: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
e710: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  NULL;..}.    } e
e720: 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20  lse {..certfile 
e730: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65  = (char*)X509_ge
e740: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66  t_default_cert_f
e750: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c  ile();...if (SSL
e760: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
e770: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63  cate_file(ctx, c
e780: 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c  ertfile, SSL_FIL
e790: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
e7a0: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63   {.#if 0..    Tc
e7b0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e7c0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
e7d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e7e0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  , "unable to use
e7f0: 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69   default certifi
e800: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
e810: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09  tfile, ": ",....
e820: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
e830: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e840: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
e850: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
e860: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
e870: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
e880: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65   set our private
e890: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
e8a0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
e8b0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  ) {..if (keyfile
e8c0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20   == NULL && key 
e8d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
e8e0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
e8f0: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79  le;..}...if (key
e900: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
e910: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20  .    /* get the 
e920: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
e930: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
e940: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
e950: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
e960: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65   == NULL) {...ke
e970: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
e980: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
e990: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
e9a0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63  rivateKey_file(c
e9b0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c  tx, F2N(keyfile,
e9c0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
e9d0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
e9e0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
e9f0: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
ea00: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
ea10: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
ea20: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
ea30: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
ea40: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ea50: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
ea60: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
ea70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
ea80: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
ea90: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
eaa0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09  keyfile, " ",...
eab0: 09 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e  .         REASON
eac0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
ead0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
eae0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
eaf0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
eb00: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
eb10: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c  ree(&ds);...} el
eb20: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55  se if (key != NU
eb30: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53  LL) {..    if (S
eb40: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
eb50: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50  teKey_ASN1(EVP_P
eb60: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65  KEY_RSA, ctx, ke
eb70: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29  y,key_len) <= 0)
eb80: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
eb90: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20  Free(&ds);.../* 
eba0: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
ebb0: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
ebc0: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
ebd0: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f  result */...Tcl_
ebe0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ebf0: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54  , NULL, TCL_STAT
ec00: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  IC);...Tcl_Appen
ec10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ec20: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70  "unable to set p
ec30: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45  ublic key: ", RE
ec40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ec50: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
ec60: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
ec70: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
ec80: 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65   }..}../* Now we
ec90: 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79   know that a key
eca0: 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62   and cert have b
ecb0: 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a  een set against.
ecc0: 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74  . * the SSL cont
ecd0: 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  ext */..if (!SSL
ece0: 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61  _CTX_check_priva
ecf0: 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09  te_key(ctx)) {..
ed00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ed10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
ed20: 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e  ivate key does n
ed30: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72  ot match the cer
ed40: 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20  tificate public 
ed50: 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63  key",....     (c
ed60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ed70: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
ed80: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
ed90: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
eda0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72  ..    /* Set ver
edb0: 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f  ification CAs */
edc0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
edd0: 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54  Init(&ds);.    T
ede0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
edf0: 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53  ds1);.    if (!S
ee00: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
ee10: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
ee20: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
ee30: 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26  s), F2N(CAdir, &
ee40: 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43  ds1)) ||..!SSL_C
ee50: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
ee60: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
ee70: 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44  ) {.#if 0..Tcl_D
ee80: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ee90: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
eea0: 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e  e(&ds1);../* Don
eeb0: 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  't currently car
eec0: 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20  e if this fails 
eed0: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  */..Tcl_AppendRe
eee0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
eef0: 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79  L default verify
ef00: 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f   paths: ", REASO
ef10: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ef20: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
ef30: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
ef40: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20   NULL;.#endif.  
ef50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70    }..    /* http
ef60: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e  s://sourceforge.
ef70: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35  net/p/tls/bugs/5
ef80: 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58  7/ */.    /* XXX
ef90: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75  :TODO: Let the u
efa0: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65  ser supply value
efb0: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f  s here instead o
efc0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  f something that
efd0: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66   exists on the f
efe0: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20  ilesystem */.   
eff0: 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e   if (CAfile != N
f000: 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46  ULL) {..STACK_OF
f010: 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72  (X509_NAME) *cer
f020: 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61  tNames = SSL_loa
f030: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65  d_client_CA_file
f040: 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73  (F2N(CAfile, &ds
f050: 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d  ));..if (certNam
f060: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  es != NULL) {.. 
f070: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63     SSL_CTX_set_c
f080: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
f090: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
f0a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  }.    }..    Tcl
f0b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f0c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
f0d0: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20  ngFree(&ds1);.  
f0e0: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a    return ctx;.}.
f0f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
f100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
f140: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d   StatusObjCmd --
f150: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63   return certific
f160: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65  ate for connecte
f170: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  d peer.. *. * Re
f180: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
f190: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
f1a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
f1b0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
f1c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
f1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f200: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
f210: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43  c int.StatusObjC
f220: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
f230: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
f240: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
f250: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
f260: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
f270: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
f280: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a  ePtr;.    X509 *
f290: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  peer;.    Tcl_Ob
f2a0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54  j *objPtr;.    T
f2b0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
f2c0: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e  .    char *chann
f2d0: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73  elName, *ciphers
f2e0: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a  ;.    int mode;.
f2f0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
f300: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a  ed char *proto;.
f310: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
f320: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69   len;.    int ni
f330: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
f340: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
f350: 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a  switch (objc) {.
f360: 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68  .case 2:..    ch
f370: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
f380: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f390: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b  (objv[1], NULL);
f3a0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
f3b0: 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28  ase 3:..    if (
f3c0: 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74  !strcmp (Tcl_Get
f3d0: 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29  String (objv[1])
f3e0: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09  , "-local")) {..
f3f0: 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54  .channelName = T
f400: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f410: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c  Obj(objv[2], NUL
f420: 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  L);...break;..  
f430: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65    }..    /* else
f440: 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e   fall-through ..
f450: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  . */.#if defined
f460: 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20  (__GNUC__)..    
f470: 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66  __attribute__((f
f480: 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65  allthrough));.#e
f490: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ndif..default:..
f4a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f4b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
f4c0: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20  objv, "?-local? 
f4d0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20  channel");..    
f4e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f4f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
f500: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
f510: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
f520: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
f530: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
f540: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
f550: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
f560: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f570: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
f580: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
f590: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
f5a0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
f5b0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
f5c0: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
f5d0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
f5e0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
f5f0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
f600: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
f610: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
f620: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
f630: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
f640: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
f650: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
f660: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
f670: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
f680: 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54  rp, "TLS", "STAT
f690: 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  US", "CHANNEL", 
f6a0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
f6b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
f6c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f6d0: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
f6e0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c   = (State *) Tcl
f6f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
f700: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
f710: 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69      /* Get certi
f720: 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20  ficate for peer 
f730: 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69  or self */.    i
f740: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
f750: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
f760: 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65  peer_certificate
f770: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
f780: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70  .    } else {..p
f790: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65  eer = SSL_get_ce
f7a0: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
f7b0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
f7c0: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
f7d0: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
f7e0: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
f7f0: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
f800: 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66  c == 2) { X509_f
f810: 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20  ree(peer); }.   
f820: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74   } else {..objPt
f830: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
f840: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
f850: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20   }..    /* Peer 
f860: 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65  cert chain (clie
f870: 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20  nt only) */.    
f880: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20  STACK_OF(X509)* 
f890: 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f  ssl_certs = SSL_
f8a0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68  get_peer_cert_ch
f8b0: 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ain(statePtr->ss
f8c0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65  l);.    if (!pee
f8d0: 72 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20  r && (ssl_certs 
f8e0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35  == NULL || sk_X5
f8f0: 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73  09_num(ssl_certs
f900: 29 20 3d 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f  ) == 0)) {..Tcl_
f910: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
f920: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41  erp, "TLS", "STA
f930: 54 55 53 22 2c 20 22 43 45 52 54 49 46 49 43 41  TUS", "CERTIFICA
f940: 54 45 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  TE", (char *) NU
f950: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
f960: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
f970: 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
f980: 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20 20 20  from cert */.   
f990: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f9a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f9b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f9c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
f9d0: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  name", -1));.   
f9e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f9f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fa00: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fa10: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67  wStringObj(SSL_g
fa20: 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61  et0_peername(sta
fa30: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
fa40: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
fa50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fa60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fa70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fa80: 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b  j("sbits", -1));
fa90: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
faa0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fab0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
fac0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f  l_NewIntObj(SSL_
fad0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
fae0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
faf0: 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70  ULL)));..    cip
fb00: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53  hers = (char*)SS
fb10: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61  L_get_cipher(sta
fb20: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fb30: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
fb40: 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d   NULL) && (strcm
fb50: 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e  p(ciphers, "(NON
fb60: 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54  E)") != 0)) {..T
fb70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fb80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
fb90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
fba0: 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72  tringObj("cipher
fbb0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
fbc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fbd0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fbe0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
fbf0: 4f 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31 29  Obj(ciphers, -1)
fc00: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
fc10: 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39   Verify the X509
fc20: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65   certificate pre
fc30: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65  sented by the pe
fc40: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69  er */.    Tcl_Li
fc50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fc60: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fc70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
fc80: 4f 62 6a 28 22 76 65 72 69 66 69 63 61 74 69 6f  Obj("verificatio
fc90: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
fca0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fcb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fcc0: 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  bjPtr,..Tcl_NewS
fcd0: 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65  tringObj(X509_ve
fce0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
fcf0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76  string(SSL_get_v
fd00: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
fd10: 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31  tePtr->ssl)), -1
fd20: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f  ));..    /* Repo
fd30: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
fd40: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
fd50: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
fd60: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
fd70: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
fd80: 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ected(statePtr->
fd90: 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ssl, &proto, &le
fda0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  n);.    Tcl_List
fdb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fdc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fdd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fde0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
fdf0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fe00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fe10: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fe20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
fe30: 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e  har *)proto, (in
fe40: 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63  t) len));.    Tc
fe50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fe60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fe70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fe80: 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f  ringObj("protoco
fe90: 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  l", -1));.    Tc
fea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
feb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fec0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fed0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
fee0: 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72  version(statePtr
fef0: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20  ->ssl), -1));.. 
ff00: 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
ff10: 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
ff20: 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
ff30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
ff40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ff50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
ff60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
ff70: 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67  signatureHashAlg
ff80: 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b 0a 20  orithm", -1));. 
ff90: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
ffa0: 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   ? SSL_get_peer_
ffb0: 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
ffc0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
ffd0: 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67  d) : SSL_get_sig
ffe0: 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65  nature_nid(state
fff0: 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29  Ptr->ssl, &nid))
10000 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
10010 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10020 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10030 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42  _NewStringObj(OB
10040 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
10050 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
10060 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
10070 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10080 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10090 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
100a0 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20   -1));.    }.   
100b0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
100c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
100d0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
100e0 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e  wStringObj("sign
100f0 61 74 75 72 65 5f 74 79 70 65 22 2c 20 2d 31 29  ature_type", -1)
10100 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  );.    if (objc 
10110 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70  == 2 ? SSL_get_p
10120 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79  eer_signature_ty
10130 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  pe_nid(statePtr-
10140 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53  >ssl, &nid) : SS
10150 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10160 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
10170 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b  r->ssl, &nid)) {
10180 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10190 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
101a0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
101b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f  ewStringObj(OBJ_
101c0 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
101d0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
101e0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
101f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10200 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10210 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d  wStringObj("", -
10220 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
10230 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10240 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
10250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10260 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
10270 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
10280 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
10290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
102d0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
102e0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
102f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10300 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
10310 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10320 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
10330 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
10340 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10380 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
10390 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
103a0 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
103b0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
103c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
103d0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
103e0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
103f0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
10400 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
10410 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
10420 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
10430 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
10440 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
10450 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
10460 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
10470 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
10480 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73      const SSL *s
10490 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  sl;.    const SS
104a0 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  L_CIPHER *cipher
104b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
104c0 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
104d0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
104e0 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
104f0 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b  ;.    long mode;
10500 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
10510 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
10520 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10530 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
10540 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  el");..return(TC
10550 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
10560 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
10570 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
10580 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10590 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
105a0 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
105b0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
105c0 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
105d0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c  L) {..return(TCL
105e0 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
105f0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
10600 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
10610 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
10620 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
10630 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
10640 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
10650 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
10660 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
10670 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
10680 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
10690 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
106a0 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
106b0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
106c0 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c  e(chan),..    "\
106d0 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
106e0 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
106f0 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
10700 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
10710 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48  CONNECTION", "CH
10720 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
10730 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
10740 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
10750 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
10760 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
10770 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
10780 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
10790 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
107a0 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
107b0 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
107c0 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
107d0 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
107e0 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
107f0 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
10800 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
10810 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
10820 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10830 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10840 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10850 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61  ewStringObj("sta
10860 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  te", -1));..Tcl_
10870 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10880 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10890 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
108a0 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f  ngObj(SSL_state_
108b0 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29  string_long(ssl)
108c0 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  , -1));.../* Get
108d0 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
108e0 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54  erver name */..T
108f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10900 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10910 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10920 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72  tringObj("server
10930 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  name", -1));..Tc
10940 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10950 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10960 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10970 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
10980 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
10990 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
109a0 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29  host_name), -1))
109b0 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
109c0 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  col */..Tcl_List
109d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
109e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
109f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10a00 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31  j("protocol", -1
10a10 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
10a20 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10a30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10a40 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
10a50 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
10a60 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  sl), -1));.../* 
10a70 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
10a80 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69  lowed */..Tcl_Li
10a90 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10aa0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10ab0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10ac0 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69  Obj("renegotiati
10ad0 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
10ae0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10af0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10b00 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10b10 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f  ngObj(..    SSL_
10b20 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67  get_secure_reneg
10b30 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74  otiation_support
10b40 28 73 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 74  (ssl) ? "support
10b50 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f  ed" : "not suppo
10b60 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f  rted", -1));.../
10b70 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Get security l
10b80 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  evel */..Tcl_Lis
10b90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10ba0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10bb0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10bc0 62 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76 65  bj("securityleve
10bd0 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  l", -1));..Tcl_L
10be0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10bf0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10c00 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
10c10 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69  j(SSL_get_securi
10c20 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b  ty_level(ssl)));
10c30 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e  .../* Session in
10c40 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  fo */..Tcl_ListO
10c50 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10c60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10c70 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10c80 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  ("session_reused
10c90 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
10ca0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10cb0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10cc0 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
10cd0 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e  nObj(SSL_session
10ce0 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a  _reused(ssl)));.
10cf0 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69  ../* Is server i
10d00 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  nfo */..Tcl_List
10d10 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10d20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10d30 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10d40 6a 28 22 69 73 5f 73 65 72 76 65 72 22 2c 20 2d  j("is_server", -
10d50 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
10d60 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10d70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10d80 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
10d90 28 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73  (SSL_is_server(s
10da0 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  sl)));.    }..  
10db0 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f    /* Cipher info
10dc0 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d   */.    cipher =
10dd0 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
10de0 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20  _cipher(ssl);.  
10df0 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20    if (cipher != 
10e00 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
10e10 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b  f[BUFSIZ] = {0};
10e20 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f  ..int bits, alg_
10e30 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74  bits;...Tcl_List
10e40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10e50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10e60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10e70 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29  j("cipher", -1))
10e80 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
10e90 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10ea0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10eb0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
10ec0 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
10ed0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a  (cipher), -1));.
10ee0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10ef0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10f00 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10f10 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e  wStringObj("stan
10f20 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29  dard_name", -1))
10f30 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
10f40 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10f50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10f60 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
10f70 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
10f80 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
10f90 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53  1));...bits = SS
10fa0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74  L_CIPHER_get_bit
10fb0 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62  s(cipher, &alg_b
10fc0 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  its);..Tcl_ListO
10fd0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10fe0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10ff0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11000 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09  ("bits", -1));..
11010 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11020 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11030 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11040 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09  IntObj(bits));..
11050 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11060 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11070 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11080 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65  StringObj("secre
11090 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09  t_bits", -1));..
110a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
110b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
110c0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
110d0 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29  IntObj(alg_bits)
110e0 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20  );../* alg_bits 
110f0 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65  is actual key se
11100 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73  cret bits. If us
11110 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65  e bits and secre
11120 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69  t (algorithm) bi
11130 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74  ts differ,..   t
11140 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62  he rest of the b
11150 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69  its are fixed, i
11160 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20  .e. for limited 
11170 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28  export ciphers (
11180 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54  bits < 56) */..T
11190 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
111a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
111b0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
111c0 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65  tringObj("min_ve
111d0 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  rsion", -1));..T
111e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
111f0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11200 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11210 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50  tringObj(SSL_CIP
11220 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  HER_get_version(
11230 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a  cipher), -1));..
11240 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d  ./* Get OpenSSL-
11250 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74  specific ID, not
11260 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 63 6c   IANA ID */..Tcl
11270 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11280 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11290 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
112a0 69 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d 31 29  ingObj("id", -1)
112b0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
112c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
112d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
112e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
112f0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
11300 69 64 28 63 69 70 68 65 72 29 29 29 3b 0a 0a 09  id(cipher)));...
11310 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
11320 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65  escription(ciphe
11330 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  r, buf, sizeof(b
11340 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
11350 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
11360 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11370 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11380 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11390 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31  description", -1
113a0 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ));..    Tcl_Lis
113b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
113c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
113d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
113e0 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d  bj(buf, -1));..}
113f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
11400 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
11410 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c     session = SSL
11420 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c  _get_session(ssl
11430 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69  );.    if (sessi
11440 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  on != NULL) {..c
11450 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11460 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a  ar *ticket;..siz
11470 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67  e_t len2;..unsig
11480 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63  ned int ulen;..c
11490 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
114a0 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
114b0 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c  .char buffer[SSL
114c0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
114d0 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
114e0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
114f0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
11500 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
11510 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
11520 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
11530 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
11540 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
11550 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f  o, &len2);..Tcl_
11560 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11570 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11580 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11590 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
115a0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
115b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
115c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
115d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
115e0 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69  char *)proto, (i
115f0 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a  nt) len2));.../*
11600 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
11610 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
11620 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
11630 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e   NPN negotiation
11640 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
11650 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78  PN..SSL_get0_nex
11660 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74  t_proto_negotiat
11670 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  ed(ssl, &proto, 
11680 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73  &ulen);..Tcl_Lis
11690 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
116a0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
116b0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
116c0 62 6a 28 22 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a  bj("npn", -1));.
116d0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
116e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
116f0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11700 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11710 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20   *)proto, (int) 
11720 75 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  ulen));.#endif..
11730 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65  ./* Resumable se
11740 73 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69  ssion */..Tcl_Li
11750 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11760 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11770 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11780 4f 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c  Obj("resumable",
11790 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
117a0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
117b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
117c0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
117d0 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65  SL_SESSION_is_re
117e0 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29  sumable(session)
117f0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
11800 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
11810 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
11820 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ) */..Tcl_ListOb
11830 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11840 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11850 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11860 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31  "start_time", -1
11870 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11880 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11890 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
118a0 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c  l_NewLongObj(SSL
118b0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
118c0 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09  e(session)));...
118d0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
118e0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74   - SSL_CTX_get_t
118f0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e  imeout (in secon
11900 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  ds) */..Tcl_List
11910 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11920 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11930 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11940 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29  j("timeout", -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 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f  _NewLongObj(SSL_
11990 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
119a0 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  out(session)));.
119b0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63  ../* Session tic
119c0 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e  ket lifetime hin
119d0 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
119e0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
119f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11a00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11a10 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69  NewStringObj("li
11a20 66 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09  fetime", -1));..
11a30 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11a40 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11a50 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11a60 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53  LongObj(SSL_SESS
11a70 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
11a80 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
11a90 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65  sion)));.../* Se
11aa0 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 73 65 73  ssion id */..ses
11ab0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
11ac0 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
11ad0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54  sion, &ulen);..T
11ae0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11af0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11b00 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11b10 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
11b20 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63  n_id", -1));..Tc
11b30 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11b40 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11b50 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  bjPtr, Tcl_NewBy
11b60 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69  teArrayObj(sessi
11b70 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65  on_id, (int) ule
11b80 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
11b90 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e  n ticket - clien
11ba0 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53  t only */..SSL_S
11bb0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
11bc0 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
11bd0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63  ket, &len2);..Tc
11be0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11bf0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11c00 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11c10 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
11c20 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a  _ticket", -1));.
11c30 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11c40 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11c50 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11c60 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
11c70 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32  cket, (int) len2
11c80 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
11c90 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c  app data */..SSL
11ca0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
11cb0 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73  cket_appdata(ses
11cc0 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
11cd0 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  len2);..Tcl_List
11ce0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11cf0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d00 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11d10 6a 28 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61  j("ticket_app_da
11d20 74 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ta", -1));..Tcl_
11d30 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11d40 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11d50 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
11d60 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
11d70 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a   (int) len2));..
11d80 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b  ./* Get master k
11d90 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53  ey */..len2 = SS
11da0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61  L_SESSION_get_ma
11db0 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e  ster_key(session
11dc0 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41  , buffer, SSL_MA
11dd0 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
11de0 47 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  GTH);..Tcl_ListO
11df0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11e00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11e10 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11e20 28 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 2d  ("master_key", -
11e30 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11e40 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11e50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11e60 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
11e70 62 6a 28 62 75 66 66 65 72 2c 20 28 69 6e 74 29  bj(buffer, (int)
11e80 20 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a 0a   len2));.    }..
11e90 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69      /* Compressi
11ea0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  on info */.    i
11eb0 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
11ec0 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53  {.#ifdef HAVE_SS
11ed0 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63  L_COMPRESSION..c
11ee0 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44  onst COMP_METHOD
11ef0 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09   *comp, *expn;..
11f00 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63  comp = SSL_get_c
11f10 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69  urrent_compressi
11f20 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d  on(ssl);..expn =
11f30 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
11f40 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b  _expansion(ssl);
11f50 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
11f60 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11f70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11f80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f  NewStringObj("co
11f90 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  mpression", -1))
11fa0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11fb0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11fc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11fd0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d  NewStringObj(com
11fe0 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  p ? SSL_COMP_get
11ff0 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e  _name(comp) : "N
12000 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ONE", -1));..Tcl
12010 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12020 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12030 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
12040 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f  ingObj("expansio
12050 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
12060 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12070 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12080 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12090 67 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f  gObj(expn ? SSL_
120a0 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78  COMP_get_name(ex
120b0 70 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31  pn) : "NONE", -1
120c0 29 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c  ));.#else..Tcl_L
120d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
120e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
120f0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12100 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f  gObj("compressio
12110 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
12120 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12130 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12140 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12150 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29  gObj("NONE", -1)
12160 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12170 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12180 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12190 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
121a0 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  xpansion", -1));
121b0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
121c0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
121d0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
121e0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e  ewStringObj("NON
121f0 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  E", -1));.#endif
12200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
12210 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20  erver info */.  
12220 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58    mode = SSL_CTX
12230 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _get_session_cac
12240 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
12250 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28  ->ctx);.    if (
12260 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
12270 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 70 72  CACHE_OFF) {..pr
12280 6f 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 20 20  oto = "off";.   
12290 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65   } else if (mode
122a0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
122b0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 72 6f  E_CLIENT) {..pro
122c0 74 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 20  to = "client";. 
122d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f     } else if (mo
122e0 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
122f0 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 70  CHE_SERVER) {..p
12300 72 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 22 3b  roto = "server";
12310 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12320 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
12330 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 70  CACHE_BOTH) {..p
12340 72 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b 0a 20  roto = "both";. 
12350 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f     } else {..pro
12360 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  to = "unknown";.
12370 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
12380 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12390 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
123a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
123b0 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 61 63  Obj("session_cac
123c0 68 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a  he_mode", -1));.
123d0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
123e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
123f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12400 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
12410 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  oto, -1));..    
12420 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12430 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
12440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12450 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
12460 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
12470 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
12480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
124c0 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20  * VersionObjCmd 
124d0 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f  -- return versio
124e0 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70  n string from Op
124f0 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73  enSSL.. *. * Res
12500 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
12510 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
12520 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
12530 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
12540 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12580 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
12590 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43   int.VersionObjC
125a0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
125b0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
125c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
125d0 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
125e0 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
125f0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
12600 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  jPtr;..    dprin
12610 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
12620 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
12630 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45  NewStringObj(OPE
12640 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58  NSSL_VERSION_TEX
12650 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f  T, -1);.    Tcl_
12660 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12670 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20  erp, objPtr);.. 
12680 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
12690 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
126a0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a  clientData;..obj
126b0 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20  c = objc;..objv 
126c0 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  = objv;.}.../*. 
126d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
126e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12710 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
12720 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
12730 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
12740 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
12750 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
12760 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
12770 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
12780 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127c0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
127d0 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
127e0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
127f0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
12800 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
12810 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
12820 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
12830 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
12840 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
12850 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
12860 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
12870 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
12880 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
12890 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
128a0 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b   int cmd, isStr;
128b0 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72  .    char buffer
128c0 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70  [16384];..    dp
128d0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
128e0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
128f0 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
12900 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12910 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d  1, objv, "subcom
12920 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09  mand ?args?");..
12930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12950 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
12960 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12970 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22  [1], commands, "
12980 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64  command", 0,&cmd
12990 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
129a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
129b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
129c0 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
129d0 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
129e0 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
129f0 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
12a00 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
12a10 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
12a20 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
12a30 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
12a40 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
12a50 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
12a60 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
12a70 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
12a80 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
12a90 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63  ;..    int listc
12aa0 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f  ,i;...    BIO *o
12ab0 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63  ut=NULL;...    c
12ac0 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53  har *k_C="",*k_S
12ad0 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f  T="",*k_L="",*k_
12ae0 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b  O="",*k_OU="",*k
12af0 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d  _CN="",*k_Email=
12b00 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  "";..    char *k
12b10 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73  eyout,*pemout,*s
12b20 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79  tr;..    int key
12b30 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61  size,serial=0,da
12b40 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45  ys=365;..#if OPE
12b50 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
12b60 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
12b70 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62  L..    BIGNUM *b
12b80 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ne = NULL;..    
12b90 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b  RSA *rsa = NULL;
12ba0 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f  .#else..    EVP_
12bb0 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20  PKEY_CTX *ctx = 
12bc0 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20  NULL;.#endif... 
12bd0 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20     if ((objc<5) 
12be0 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09  || (objc>6)) {..
12bf0 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
12c00 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12c10 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66  v, "keysize keyf
12c20 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e  ile certfile ?in
12c30 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20  fo?");...return 
12c40 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
12c50 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f  }...    if (Tcl_
12c60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12c70 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
12c80 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f  keysize) != TCL_
12c90 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54  OK) {...return T
12ca0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
12cb0 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c  ..    keyout=Tcl
12cc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12cd0 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74  3]);..    pemout
12ce0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
12cf0 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66  bjv[4]);..    if
12d00 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c   (isStr) {...Tcl
12d10 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b  _SetVar(interp,k
12d20 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54  eyout,"",0);...T
12d30 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
12d40 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,pemout,"",0);..
12d50 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
12d60 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20  objc>=6) {...if 
12d70 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45  (Tcl_ListObjGetE
12d80 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
12d90 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73  objv[5],....&lis
12da0 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54  tc, &listv) != T
12db0 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72  CL_OK) {...    r
12dc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12dd0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73  ...}....if ((lis
12de0 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09  tc%2) != 0) {...
12df0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
12e00 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d  t(interp,"Inform
12e10 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20  ation list must 
12e20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72  have even number
12e30 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e   of arguments",N
12e40 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
12e50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
12e60 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  }...for (i=0; i<
12e70 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09  listc; i+=2) {..
12e80 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74  .    str=Tcl_Get
12e90 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29  String(listv[i])
12ea0 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ;...    if (strc
12eb0 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d  mp(str,"days")==
12ec0 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
12ed0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12ee0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
12ef0 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a  &days)!=TCL_OK).
12f00 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
12f10 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
12f20 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
12f30 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d  (str,"serial")==
12f40 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
12f50 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12f60 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
12f70 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b  &serial)!=TCL_OK
12f80 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
12f90 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
12fa0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
12fb0 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20  mp(str,"C")==0) 
12fc0 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74  {....k_C=Tcl_Get
12fd0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12fe0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12ff0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13000 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "ST")==0) {....k
13010 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _ST=Tcl_GetStrin
13020 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13030 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13040 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d  strcmp(str,"L")=
13050 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c  =0) {....k_L=Tcl
13060 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
13070 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13080 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13090 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09  str,"O")==0) {..
130a0 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_O=Tcl_GetStr
130b0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
130c0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
130d0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55   (strcmp(str,"OU
130e0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55  ")==0) {....k_OU
130f0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
13100 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
13110 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13120 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30  cmp(str,"CN")==0
13130 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f  ) {....k_CN=Tcl_
13140 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13150 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13160 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13170 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20  tr,"Email")==0) 
13180 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c  {....k_Email=Tcl
13190 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
131a0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
131b0 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65  else {....Tcl_Se
131c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
131d0 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65  Unknown paramete
131e0 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74  r",NULL);....ret
131f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13200 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
13210 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
13220 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
13230 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
13240 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b   bne = BN_new();
13250 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f  ..    rsa = RSA_
13260 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79  new();..    pkey
13270 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28   = EVP_PKEY_new(
13280 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20  );..    if (bne 
13290 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d  == NULL || rsa =
132a0 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d  = NULL || pkey =
132b0 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65  = NULL || !BN_se
132c0 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46  t_word(bne,RSA_F
132d0 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e  4) ||...!RSA_gen
132e0 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61  erate_key_ex(rsa
132f0 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20  , keysize, bne, 
13300 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b  NULL) || !EVP_PK
13310 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b  EY_assign_RSA(pk
13320 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56  ey, rsa)) {...EV
13330 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
13340 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65  );.../* RSA_free
13350 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20  (rsa); freed by 
13360 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f  EVP_PKEY_free */
13370 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
13380 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79  .#else..    pkey
13390 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28   = EVP_RSA_gen((
133a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65  unsigned int) ke
133b0 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78  ysize);..    ctx
133c0 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
133d0 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a  new(pkey,NULL);.
133e0 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d  .    if (pkey ==
133f0 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20   NULL || ctx == 
13400 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45  NULL || !EVP_PKE
13410 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74  Y_keygen_init(ct
13420 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45  x) ||...!EVP_PKE
13430 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65  Y_CTX_set_rsa_ke
13440 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b  ygen_bits(ctx, k
13450 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f  eysize) || !EVP_
13460 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c  PKEY_keygen(ctx,
13470 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50   &pkey)) {...EVP
13480 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13490 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58  ;...EVP_PKEY_CTX
134a0 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64  _free(ctx);.#end
134b0 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  if...Tcl_SetResu
134c0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
134d0 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
134e0 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
134f0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13500 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
13510 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  {...if (isStr) {
13520 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
13530 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
13540 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
13550 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
13560 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
13570 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
13580 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
13590 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
135a0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
135b0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
135c0 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
135d0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
135e0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
135f0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66  terp,keyout,buff
13600 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
13610 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
13620 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
13630 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
13640 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
13650 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
13660 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
13670 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75  lename(out,keyou
13680 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
13690 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
136a0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
136b0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
136c0 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d  L);...    /* PEM
136d0 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72  _write_bio_RSAPr
136e0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73  ivateKey(out, rs
136f0 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  a, NULL, NULL, 0
13700 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a  , NULL, NULL); *
13710 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  /...    BIO_free
13720 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a  _all(out);.. .}.
13730 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30  ...if ((cert=X50
13740 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20  9_new())==NULL) 
13750 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
13760 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
13770 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ror generating c
13780 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65  ertificate reque
13790 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  st",NULL);...   
137a0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
137b0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
137c0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
137d0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
137e0 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
137f0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
13800 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
13810 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73  );...}....X509_s
13820 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c  et_version(cert,
13830 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47  2);...ASN1_INTEG
13840 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f  ER_set(X509_get_
13850 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72  serialNumber(cer
13860 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35  t),serial);...X5
13870 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
13880 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72  09_getm_notBefor
13890 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35  e(cert),0);...X5
138a0 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
138b0 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72  09_getm_notAfter
138c0 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
138d0 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
138e0 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
138f0 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
13900 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
13910 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
13920 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
13930 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
13940 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
13950 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13960 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13970 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  C, -1, -1, 0);..
13980 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
13990 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
139a0 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"ST", MBSTRING_
139b0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
139c0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53  gned char *) k_S
139d0 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  T, -1, -1, 0);..
139e0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
139f0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
13a00 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"L", MBSTRING_A
13a10 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
13a20 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
13a30 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
13a40 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
13a50 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
13a60 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
13a70 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
13a80 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d  d char *) k_O, -
13a90 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
13aa0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
13ab0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55  _by_txt(name,"OU
13ac0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
13ad0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
13ae0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d   char *) k_OU, -
13af0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
13b00 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
13b10 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e  _by_txt(name,"CN
13b20 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
13b30 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
13b40 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
13b50 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
13b60 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
13b70 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
13b80 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
13b90 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
13ba0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d  ned char *) k_Em
13bb0 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  ail, -1, -1, 0);
13bc0 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62  ....X509_set_sub
13bd0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e  ject_name(cert,n
13be0 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35  ame);....if (!X5
13bf0 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65  09_sign(cert,pke
13c00 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29  y,EVP_sha256()))
13c10 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
13c20 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
13c30 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
13c40 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
13c50 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
13c60 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
13c70 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
13c80 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54  ;.#endif...    T
13c90 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
13ca0 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
13cb0 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
13cc0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
13cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13ce0 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29  .}....if (isStr)
13cf0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
13d00 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
13d10 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
13d20 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
13d30 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42  cert);...    i=B
13d40 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
13d50 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
13d60 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
13d70 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
13d80 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
13d90 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
13da0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
13db0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
13dc0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
13dd0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
13de0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
13df0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
13e00 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
13e10 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
13e20 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
13e30 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,pemout);...    
13e40 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
13e50 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
13e60 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
13e70 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  (out);...}....X5
13e80 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
13e90 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
13ea0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
13eb0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
13ec0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
13ed0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
13ee0 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a  endif..    }..}.
13ef0 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
13f00 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
13f10 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
13f20 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
13f30 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
13f40 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e  *********/./* In
13f60 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  it             *
13f70 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
13f80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
13f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
13fe0 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
13ff0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
14000 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
14010 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
14020 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
14030 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
14040 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
14050 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
14060 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
14070 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
14080 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
14090 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
140a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140e0 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
140f0 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50  ree(char *blockP
14100 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  tr) {.    State 
14110 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
14120 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a  te *)blockPtr;..
14130 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14140 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  led");..    Tls_
14150 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
14160 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63  .    ckfree(bloc
14170 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  kPtr);.}.../*. *
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141c0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c  ---. *. * Tls_Cl
141d0 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ean --. *. *.Thi
141e0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
141f0 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
14200 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
14210 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
14220 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
14230 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
14240 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20   below 1.  This 
14250 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c  should. *.be cal
14260 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  led synchronousl
14270 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72  y by the ClosePr
14280 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20  oc, not in the. 
14290 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  *.EventuallyFree
142a0 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
142b0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
142c0 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
142d0 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
142e0 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
142f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14330 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54  -----. */.void T
14340 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a  ls_Clean(State *
14350 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
14360 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
14370 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
14380 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
14390 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65   here that we're
143a0 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
143b0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
143c0 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
143d0 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
143e0 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
143f0 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
14400 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
14410 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
14420 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
14430 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
14440 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
14450 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65   {..ckfree(state
14460 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73  Ptr->protos);..s
14470 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
14480 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14490 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
144a0 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20  bio) {../* This 
144b0 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68  will call SSL_sh
144c0 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34  utdown. Bug 1414
144d0 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  045 */..dprintf(
144e0 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70  "BIO_free_all(%p
144f0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69  )", statePtr->bi
14500 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c  o);..BIO_free_al
14510 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  l(statePtr->bio)
14520 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ;..statePtr->bio
14530 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14540 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14550 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66  >ssl) {..dprintf
14560 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c  ("SSL_free(%p)",
14570 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b   statePtr->ssl);
14580 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65  ..SSL_free(state
14590 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74  Ptr->ssl);..stat
145a0 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c  ePtr->ssl = NULL
145b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
145c0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b  statePtr->ctx) {
145d0 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73  ..SSL_CTX_free(s
145e0 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
145f0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
14600 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
14610 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
14620 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44  llback) {..Tcl_D
14630 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
14640 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
14650 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  ..statePtr->call
14660 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  back = NULL;.   
14670 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14680 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b  Ptr->password) {
14690 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
146a0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
146b0 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74  sword);..statePt
146c0 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55  r->password = NU
146d0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
146e0 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
146f0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
14700 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
14710 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72  vcmd);..statePtr
14720 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  ->vcmd = NULL;. 
14730 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
14740 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  f("Returning");.
14750 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
147a0 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20   * Tls_Init --. 
147b0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70  *. *.This is a p
147c0 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a  ackage initializ
147d0 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c  ation procedure,
147e0 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64   which is called
147f0 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20  . *.by Tcl when 
14800 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20  this package is 
14810 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  to be added to a
14820 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  n interpreter.. 
14830 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53  *. * Results:  S
14840 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  sl configured an
14850 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53  d loaded. *. * S
14860 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
14870 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20   create the ssl 
14880 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c  command, initial
14890 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a  ize ssl context.
148a0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
148b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c  --------. */.DLL
148f0 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49  EXPORT int Tls_I
14900 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
14910 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f  interp) {.    co
14920 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
14930 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
14940 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
14950 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d  l.h"..0x00.    }
14960 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
14970 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
14980 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  *.     * We only
14990 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34   support Tcl 8.4
149a0 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20 2a   or newer.     *
149b0 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 65  /.    if (.#ifde
149c0 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
149d0 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69  .Tcl_InitStubs(i
149e0 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
149f0 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52  .#else..Tcl_PkgR
14a00 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22  equire(interp, "
14a10 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 29  Tcl", "8.4-", 0)
14a20 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 4c  .#endif.. == NUL
14a30 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
14a40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
14a50 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69     if (TlsLibIni
14a60 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  t(0) != TCL_OK) 
14a70 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
14a80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
14a90 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  ld not initializ
14aa0 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20  e SSL library", 
14ab0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
14ac0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14ad0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14ae0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14af0 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  , "tls::ciphers"
14b00 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c  , CiphersObjCmd,
14b10 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
14b20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
14b30 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
14b40 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
14b50 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
14b60 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22  tls::connection"
14b70 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  , ConnectionInfo
14b80 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
14b90 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
14ba0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
14bb0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
14bc0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
14bd0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64  terp, "tls::hand
14be0 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b  shake", Handshak
14bf0 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  eObjCmd, (Client
14c00 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
14c10 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
14c20 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
14c30 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
14c40 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70  nterp, "tls::imp
14c50 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43  ort", ImportObjC
14c60 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
14c70 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
14c80 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
14c90 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14ca0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14cb0 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74  , "tls::unimport
14cc0 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
14cd0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
14ce0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
14cf0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
14d00 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
14d10 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
14d20 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20   "tls::status", 
14d30 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43  StatusObjCmd, (C
14d40 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
14d50 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
14d60 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
14d70 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14d80 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
14d90 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
14da0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ionObjCmd, (Clie
14db0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
14dc0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
14dd0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
14de0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
14df0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d  (interp, "tls::m
14e00 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64  isc", MiscObjCmd
14e10 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
14e20 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
14e30 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
14e40 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
14e50 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14e60 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  "tls::protocols"
14e70 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  , ProtocolsObjCm
14e80 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
14e90 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
14ea0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
14eb0 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29  .    if (interp)
14ec0 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74   {..Tcl_Eval(int
14ed0 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53  erp, tlsTclInitS
14ee0 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  cript);.    }.. 
14ef0 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b     return(Tcl_Pk
14f00 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
14f10 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f   "tls", PACKAGE_
14f20 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a  VERSION));.}../*
14f30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
14f70 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
14f80 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fb0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e  -------*. *.Stan
14fc0 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72  dard procedure r
14fd0 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64  equired by 'load
14fe0 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  '.. *.Initialize
14ff0 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  s this extension
15000 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65   for a safe inte
15010 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d  rpreter.. *.----
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15050 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
15060 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73  :. *..As of 'Tls
15070 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73  _Init'. *. *.Res
15080 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64  ult:. *..A stand
15090 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f  ard Tcl error co
150a0 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
150e0 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
150f0 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28  nt Tls_SafeInit(
15100 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15110 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  rp) {.    dprint
15120 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
15130 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74   return(Tls_Init
15140 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a  (interp));.}../*
15150 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15190 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20  .TlsLibInit --. 
151a0 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151d0 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61  -----*. *.Initia
151e0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
151f0 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
15200 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  cation. *.------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
15240 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  *.Side effects:.
15250 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20   *..initializes 
15260 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
15270 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f  *.Result:. *..no
15280 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
152c0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
152d0 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
152e0 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20  initialize) {.  
152f0 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69    static int ini
15300 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20  tialized = 0;.  
15310 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54    int status = T
15320 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  CL_OK;.#if defin
15330 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15340 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15350 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15360 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73  size_t num_locks
15370 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
15380 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20   (uninitialize) 
15390 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69  {..if (!initiali
153a0 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69  zed) {..    dpri
153b0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
153c0 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20  initialize, but 
153d0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69  we are not initi
153e0 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20  alized");...    
153f0 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
15400 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73  .}...dprintf("As
15410 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15420 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  ize");..#if defi
15430 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15440 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15450 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
15460 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
15470 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63  t_mx);...if (loc
15480 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28  ks) {..    free(
15490 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63  locks);..    loc
154a0 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ks = NULL;..    
154b0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
154c0 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69  .}.#endif..initi
154d0 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66  alized = 0;..#if
154e0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
154f0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15500 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15510 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
15520 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
15530 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43  ndif...return(TC
15540 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  L_OK);.    }..  
15550 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
15560 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
15570 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
15580 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
15590 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29  ..return(status)
155a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
155b0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
155c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
155d0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
155e0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
155f0 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
15600 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
15610 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e  );.#endif.    in
15620 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
15630 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15640 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15650 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15660 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63  ADS).    num_loc
15670 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  ks = 1;.    lock
15680 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e  sCount = (int) n
15690 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f  um_locks;.    lo
156a0 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  cks = malloc(siz
156b0 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
156c0 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65  m_locks);.    me
156d0 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73  mset(locks, 0, s
156e0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
156f0 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64  num_locks);.#end
15700 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  if..    /* Initi
15710 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72  alize BOTH libcr
15720 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e  ypto and libssl.
15730 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f   */.    OPENSSL_
15740 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c  init_ssl(OPENSSL
15750 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53  _INIT_LOAD_SSL_S
15760 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c  TRINGS | OPENSSL
15770 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54  _INIT_LOAD_CRYPT
15780 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45  O_STRINGS..| OPE
15790 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
157a0 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e  L_CIPHERS | OPEN
157b0 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
157c0 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b  _DIGESTS, NULL);
157d0 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63  ..    BIO_new_tc
157e0 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66  l(NULL, 0);..#if
157f0 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   0.    /*.     *
15800 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76   XXX:TODO: Remov
15810 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20  e this code and 
15820 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
15830 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66  a check.     * f
15840 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70  or enough entrop
15850 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79  y and do not try
15860 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
15870 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62  wn.     * terrib
15880 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20  le entropy.     
15890 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  */.    /*.     *
158a0 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   Seed the random
158b0 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
158c0 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
158d0 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69  rary,.     * usi
158e0 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20  ng the do/while 
158f0 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73  construct becaus
15900 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74  e of the bug not
15910 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  e in the.     * 
15920 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68  OpenSSL FAQ at h
15930 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73  ttp://www.openss
15940 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61  l.org/support/fa
15950 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20  q.html#USER1.   
15960 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63    *.     * The c
15970 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c  rux of the probl
15980 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72  em is that Solar
15990 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61  is 7 does not ha
159a0 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76  ve a.     * /dev
159b0 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f  /random or /dev/
159c0 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73  urandom device s
159d0 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68  o it cannot gath
159e0 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a  er enough.     *
159f0 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68   entropy from th
15a00 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68  e RAND_seed() wh
15a10 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a  en TLS initializ
15a20 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20  es and refuses. 
15a30 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74      * to go furt
15a40 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72  her. Earlier ver
15a50 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c  sions of OpenSSL
15a60 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61   carried on rega
15a70 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a  rdless..     */.
15a80 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67      srand((unsig
15a90 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74  ned int) time((t
15aa0 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b  ime_t *) NULL));
15ab0 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28  .    do {..for (
15ac0 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69  i = 0; i < 16; i
15ad0 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73  ++) {..    rnd_s
15ae0 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68  eed[i] = 1 + (ch
15af0 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e  ar) (255.0 * ran
15b00 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e  d()/(RAND_MAX+1.
15b10 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65  0));..}..RAND_se
15b20 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a  ed(rnd_seed, siz
15b30 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a  eof(rnd_seed));.
15b40 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e      } while (RAN
15b50 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29  D_status() != 1)
15b60 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ;.#endif..#if de
15b70 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
15b80 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
15b90 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
15ba0 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28  Tcl_MutexUnlock(
15bb0 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
15bc0 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  f...return(statu
15bd0 73 29 3b 0a 7d 0a                                s);.}.