Hex Artifact Content

Artifact a40494189239b3bcbbc471d5b6f255e6cd83d9ed7d51aa02b3e528279d0d1100:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c  ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65  = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29  rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20     ok = 1;..}.  
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45    } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68  rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  }..    Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20   * InfoCallback 
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52   process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f  static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20  re, int ret) {. 
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70   *minor;..    dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66  .return;..    if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54  _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20   = "start";.    
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a  AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65  ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f  _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c  r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d  SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22  ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50  e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63  T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26  ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d   SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09  inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09   SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b  minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09   & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b  .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09   & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b  .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72  ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bd0: 20 20 20 20 20 20 20 20 76 65 72 20 3d 20 22 6e          ver = "n
1be0: 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  one";..break;.  
1bf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20    default:..ver 
1c00: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72  = "unknown";..br
1c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c20: 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f  switch (content_
1c30: 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65  type) {.    case
1c40: 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a   SSL3_RT_HEADER:
1c50: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72  ..type = "Header
1c60: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
1c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1c80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1c90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ca0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1cb0: 70 65 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  pe";.        bre
1cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1cd0: 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48  3_RT_CHANGE_CIPH
1ce0: 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d  ER_SPEC:..type =
1cf0: 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22   "Change Cipher"
1d00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d20: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d  T_ALERT:..type =
1d30: 20 22 41 6c 65 72 74 22 3b 0a 20 20 20 20 20 20   "Alert";.      
1d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 20 20 20 20 20 20  ndshake";.      
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d90: 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43  e SSL3_RT_APPLIC
1da0: 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70  ATION_DATA:..typ
1db0: 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a  e = "App Data";.
1dc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49  , buffer, min(BI
1f10: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20  O_pending(bio), 
1f20: 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 6e  14999));..n = (n
1f30: 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75  <0) ? 0 : n;..bu
1f40: 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76  ffer[n] = 0;..(v
1f50: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69  oid)BIO_flush(bi
1f60: 6f 29 3b 0a 20 09 42 49 4f 5f 66 72 65 65 28 62  o);. .BIO_free(b
1f70: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f  io);.   }..    /
1f80: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
1f90: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
1fa0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
1fb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
1fc0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1fd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1fe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1ff0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
2010: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
2020: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2030: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2040: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2050: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2060: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2070: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2080: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2090: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
20a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
20b0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
20d0: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
20e0: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
20f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2100: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2110: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
2130: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2150: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2160: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2170: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
2180: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2190: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
21b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
21c0: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
21d0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
21e0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
21f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2200: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2210: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2220: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2230: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2240: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2250: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
2260: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
22b0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
22c0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
22d0: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
22e0: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
22f0: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2300: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2310: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2320: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
2330: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
2340: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
2350: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
2360: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
2370: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
2380: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
2390: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
23a0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
23b0: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
23c0: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63  cks:. *.certific
23d0: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65  ate chain is che
23e0: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  cked starting wi
23f0: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e  th the deepest n
2400: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09  esting level. *.
2410: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63    (the root CA c
2420: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20  ertificate) and 
2430: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f  worked upward to
2440: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74   the peer's cert
2450: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20  ificate.. *.All 
2460: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76  signatures are v
2470: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69  alid, current ti
2480: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72  me is within fir
2490: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69  st and last vali
24a0: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68  dity time.. *.Ch
24b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72  eck that the cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75  tificate is issu
24d0: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72  ed by the issuer
24e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
24f0: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  uer.. *.Check th
2500: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  e revocation sta
2510: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72  tus for each cer
2520: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65  tificate.. *.Che
2530: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20  ck the validity 
2540: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c  of the given CRL
2550: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65   and the cert re
2560: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e  vocation status.
2570: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f  . *.Check the po
2580: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68  licies of all th
2590: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20  e certificates. 
25a0: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65  *. * Args. *.pre
25b0: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61  verify_ok indica
25c0: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  tes whether the 
25d0: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69  certificate veri
25e0: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20  fication passed 
25f0: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20  (1) or not (0). 
2600: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2610: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e  .A callback boun
2620: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20  d to the socket 
2630: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  may return one o
2640: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20  f:. *.    0...- 
2650: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2660: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69  is deemed invali
2670: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61  d, send verifica
2680: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69  tion. *....  fai
2690: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65  lure alert to pe
26a0: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  er, and terminat
26b0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
26c0: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65      1...- the ce
26d0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
26e0: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69  med valid, conti
26f0: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61  nue with handsha
2700: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79  ke.. *.    empty
2710: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61   string.- no cha
2720: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61  nge to certifica
2730: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a  te validation. *
2740: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2750: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
2760: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
2770: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
2780: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2790: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
27a0: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
27b0: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
27c0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d  re reason. *. *-
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
2820: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  t.VerifyCallback
2830: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54  (int ok, X509_ST
2840: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a  ORE_CTX *ctx) {.
2850: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
2860: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a  Ptr;.    SSL   *
2870: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30  ssl..= (SSL*)X50
2880: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
2890: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c  ex_data(ctx, SSL
28a0: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30  _get_ex_data_X50
28b0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28  9_STORE_CTX_idx(
28c0: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63  ));.    X509  *c
28d0: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  ert..= X509_STOR
28e0: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e  E_CTX_get_curren
28f0: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20  t_cert(ctx);.   
2900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
2910: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67  .= (State*)SSL_g
2920: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29  et_app_data(ssl)
2930: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
2940: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
2950: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
2960: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35   int depth..= X5
2970: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2980: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78  _error_depth(ctx
2990: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09  );.    int err..
29a0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
29b0: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b  _get_error(ctx);
29c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
29d0: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b  erify: %d", ok);
29e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
29f0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
2a00: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69  _Obj*)NULL) {..i
2a10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c  f (statePtr->vfl
2a20: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59  ags & SSL_VERIFY
2a30: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
2a40: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65  _CERT) {..    re
2a50: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65  turn ok;..} else
2a60: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31   {..    return 1
2a70: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
2a80: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c  if (cert == NULL
2a90: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29   || ssl == NULL)
2aa0: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
2ab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2ac0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2ad0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
2ae0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2af0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2b00: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2b10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2b40: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2b50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2b70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2b80: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
2b90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2ba0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2bb0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2c00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2c30: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2c40: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2c80: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
2c90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2cb0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2cd0: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2ce0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2cf0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2d00: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f    /* Prevent I/O
2d10: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20   while callback 
2d20: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a  is in progress *
2d30: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  /.    /* statePt
2d40: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2d50: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f  TCL_CALLBACK; */
2d60: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2d70: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2d80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2d90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2da0: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2db0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2dc0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2dd0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2de0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2df0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2e00: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2e10: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2e20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2e30: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2e40: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2e50: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2e60: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2eb0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2ec0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2ed0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2ee0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2ef0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2f00: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2f10: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2f20: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2f30: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2f40: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
2f50: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
2f60: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
2f70: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
2fd0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
2fe0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
2ff0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3000: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
3010: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
3020: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
3030: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
3040: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3050: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3060: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3090: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
30a0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
30b0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
30c0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
30d0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
30e0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
30f0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3100: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3110: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3120: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3130: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3140: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3150: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3160: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3180: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
31b0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
31c0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
31d0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
31e0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
31f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3200: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3230: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
3240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3250: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3260: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55  sult(interp), NU
3270: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  LL)) != NULL) {.
3280: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
32c0: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  -1));..    } els
32d0: 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54  e {..listPtr = T
32e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
32f0: 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28   NULL);..while (
3300: 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  (err = ERR_get_e
3310: 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a  rror()) != 0) {.
3320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3340: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
3350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3360: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
3370: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
3380: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
3390: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
33b0: 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d   listPtr);.    }
33c0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
33d0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
33e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
33f0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3400: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
3410: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
3420: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
3430: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3440: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
3450: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79  ------. *. * Key
34a0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  LogCallback --. 
34b0: 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69  *. *.Write recei
34c0: 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20  ved key data to 
34d0: 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20  log file.. *. * 
34e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
34f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3540: 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61  */.void KeyLogCa
3550: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3560: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61   *ssl, const cha
3570: 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63  r *line) {.    c
3580: 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e  har *str = geten
3590: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
35a0: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a  ;.    FILE *fd;.
35b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
35c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
35d0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f  (str) {..fd = fo
35e0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09  pen(str, "a");..
35f0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c  fprintf(fd, "%s\
3600: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73  n",line);..fclos
3610: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  e(fd);.    }.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3670: 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63  Password Callbac
3680: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  k --. *. *.Calle
3690: 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72  d when a passwor
36a0: 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20  d for a private 
36b0: 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72  key loading/stor
36c0: 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72  ing a PEM. *.cer
36d0: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
36e0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
36f0: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
3700: 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74  and returns. *.t
3710: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3720: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3730: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3740: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3750: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3760: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3770: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
3780: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
3790: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
37a0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
37b0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
37c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3810: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3820: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3830: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3840: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3850: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
3870: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
3880: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3890: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
38a0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
38b0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
38c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20      int code;.. 
38d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
38e0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ed");..    /* If
38f0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73   no callback, us
3900: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61  e default callba
3910: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ck */.    if (st
3920: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3930: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
3940: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
3950: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
3960: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
3970: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
3980: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
3990: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
39a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
39b0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20  sult(interp);.. 
39c0: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
39d0: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
39e0: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
39f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74   (int)strlen(ret
3a00: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
3a10: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
3a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
3a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
3a70: 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54  password);.    T
3a80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3a90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3aa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3ab0: 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f  tringObj("passwo
3ac0: 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  rd", -1));.    T
3ad0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3ae0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3af0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
3b00: 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a  ntObj(rwflag));.
3b10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3b20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3b30: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3b40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29  _NewIntObj(size)
3b50: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
3b60: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3b70: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3b80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3b90: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3ba0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
3bb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
3bc0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
3bd0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3be0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
3bf0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
3c00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
3c10: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3c20: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
3c30: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
3c40: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
3c50: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
3c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
3c70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3c80: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
3c90: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
3ca0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
3cb0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
3cc0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  if.    }.    Tcl
3cd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3ce0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
3cf0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3d00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3d10: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65  .    /* If succe
3d20: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b  ssful, pass back
3d30: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3d40: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66   and truncate if
3d50: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20   too long */.   
3d60: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
3d70: 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b  _OK) {..int len;
3d80: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3d90: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3da0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3db0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3dc0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
3dd0: 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20   (len > size-1) 
3de0: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a  {..    len = siz
3df0: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
3e00: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3e10: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
3e20: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
3e30: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3e40: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
3e50: 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20  return(len);.   
3e60: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3e80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
3e90: 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn -1;.}.../*. 
3ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69  ----. *. * Sessi
3ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  on Callback for 
3f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
3f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e  .Called when a n
3f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64  ew session is ad
3f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65  ded to the cache
3f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09  . In TLS 1.3. *.
3f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65  this may be rece
3f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ived multiple ti
3f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61  mes after the ha
3f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09  ndshake. For. *.
3f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  earlier versions
3fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72  , this will be r
3fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74  eceived during t
3fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  he handshake.. *
3fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65  .This is the pre
3fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62  ferred way to ob
3ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65  tain a resumable
4000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20   session.. *. * 
4010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
4020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65   codes:. *.0 = e
4070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69  rror where sessi
4080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64  on will be immed
4090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66  iately removed f
40a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
40b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73   cache.. *.1 = s
40c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70  uccess where app
40d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e   retains session
40e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68   in session cach
40f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c  e, and must call
4100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65   SSL_SESSION_fre
4110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20  e() when done.. 
4120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61  ic int.SessionCa
4180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
41a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
41b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
41c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
41d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
41e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
41f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
4230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
4250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
4270: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
4280: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
4290: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
42a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
42b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
42c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
42d0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4300: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
4310: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4320: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4330: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
4360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
43a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
43b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
43c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
43d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29  j("session", -1)
43e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
43f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4410: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4420: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4440: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4450: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
4460: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
4470: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
4480: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
4490: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
44a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
44b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
44c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
44d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
44e0: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c  ion_id, (int) ul
44f0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
4500: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
4510: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
4520: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
4530: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
4540: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
4550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4570: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
4580: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
4590: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  int) len2));..  
45a0: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
45b0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
45c0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
45d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
45e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
45f0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
4600: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
4610: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
4620: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
4630: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
4640: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
4650: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
4660: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4670: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
4680: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
4690: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
46a0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
46b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
46c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
46d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4720: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63  . * ALPN Callbac
4730: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e  k for Servers an
4740: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66  d NPN Callback f
4750: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4760: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74  . *.Perform prot
4770: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
4780: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65  h2, h3, etc.) se
4790: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  lection for the.
47a0: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e   *.incoming conn
47b0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61  ection. Called a
47c0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73  fter Hello and s
47d0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  erver callbacks.
47e0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20  . *.Where 'out' 
47f0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  is selected prot
4800: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73  ocol and 'in' is
4810: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74   the peer advert
4820: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ised list.. *. *
4830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4880: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4890: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41  TLSEXT_ERR_OK: A
48a0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  LPN protocol sel
48b0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
48c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
48d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
48e0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
48f0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65  There was no ove
4900: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65  rlap between the
4910: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20   client's. *.   
4920: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61   supplied list a
4930: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f  nd the server co
4940: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65  nfiguration. The
4950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
4960: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09   be aborted.. *.
4970: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4980: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  OACK: ALPN proto
4990: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
49a0: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20  , e.g., because 
49b0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70  no ALPN. *.    p
49c0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e  rotocols are con
49d0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
49e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
49f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4a00: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4a50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41   */.static int.A
4a60: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LPNCallback(cons
4a70: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
4a80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4a90: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4aa0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
4ab0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4ac0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
4ad0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
4ae0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
4af0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4b00: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
4b10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4b20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4b30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4b40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4b50: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
4b60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
4b70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
4b80: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
4b90: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
4ba0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4bb0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4bc0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
4bd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
4be0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
4bf0: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20  next_proto(out, 
4c00: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
4c10: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
4c20: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
4c30: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
4c50: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74  IATED) {../* Mat
4c60: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73  ch found */..res
4c70: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4c80: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4c90: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e   {../* OPENSSL_N
4ca0: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20  PN_NO_OVERLAP = 
4cb0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
4cc0: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72  se first item fr
4cd0: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63  om client protoc
4ce0: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20  ol list */..res 
4cf0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4d00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4d10: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4d20: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
4d30: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4d40: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20  rn res;.    }.. 
4d50: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4d60: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4d70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4d80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4d90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
4da0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4db0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4dc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
4de0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
4df0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4e00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4e10: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
4e20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4e30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4e40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4e50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4e60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4e70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4e80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4e90: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29  ngObj(*out, -1))
4ea0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4ec0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4ed0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
4ee0: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45  (res == SSL_TLSE
4ef0: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20  XT_ERR_OK));..  
4f00: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
4f10: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
4f20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4f30: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
4f40: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
4f50: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
4f60: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
4f70: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c  _NOACK;.    } el
4fa0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
4fb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
4fc0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4fd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
4fe0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4ff0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20  _ALERT_FATAL;.  
5000: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5010: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5030: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5080: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50  *. * Advertise P
5090: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63  rotocols Callbac
50a0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f  k for Next Proto
50b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20  col Negotiation 
50c0: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48  (NPN) in ServerH
50d0: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61  ello --. *. *.ca
50e0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20  lled when a TLS 
50f0: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c  server needs a l
5100: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64  ist of supported
5110: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e   protocols for N
5120: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20  ext. *.Protocol 
5130: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a  Negotiation.. *.
5140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5160: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65  ffects:. *. * Re
5170: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5180: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5190: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73  : NPN protocol s
51a0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
51b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
51c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
51d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20  _ERR_NOACK: NPN 
51e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
51f0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
5200: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5210: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
5260: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61  fdef USE_NPN.sta
5270: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62  tic int.NPNCallb
5280: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
5290: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
52a0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
52b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74  nsigned int *out
52c0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
52d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
52e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
52f0: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  arg;..    dprint
5300: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5310: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
5320: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
5330: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5340: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5360: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  Set protocols li
5370: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  st */.    if (st
5380: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
5390: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20  = NULL) {..*out 
53a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
53b0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73  os;..*outlen = s
53c0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
53d0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
53e0: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a  {..*out = NULL;.
53f0: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72  .*outlen = 0;..r
5400: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5410: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c  }.    return SSL
5430: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5440: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a  }.#endif.../*. *
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61  ---. *. * SNI Ca
54a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
54b0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  rs --. *. *.Perf
54c0: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20  orm server-side 
54d0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c  SNI hostname sel
54e0: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63  ection after rec
54f0: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e  eiving SNI exten
5500: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e  sion. *.in Clien
5510: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20  t Hello. Called 
5520: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c  after hello call
5530: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20  back but before 
5540: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  ALPN callback.. 
5550: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5560: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5570: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
5580: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
5590: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
55a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
55b0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
55c0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  K: SNI hostname 
55d0: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  is accepted. The
55e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
55f0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5600: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5610: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61  ATAL: SNI hostna
5620: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5630: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5640: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f  on. *.    is abo
5650: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f  rted. Default fo
5660: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41  r alert is SSL_A
5670: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5680: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  AME.. *.SSL_TLSE
5690: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
56a0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61  NING: SNI hostna
56b0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
56c0: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72  ed, warning aler
56d0: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e  t. *.    sent (n
56e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
56f0: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f  TLSv1.3). The co
5700: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5710: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5720: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49  T_ERR_NOACK: SNI
5730: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5740: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f   accepted and no
5750: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a  t acknowledged,.
5760: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53   *.    e.g. if S
5770: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  NI has not been 
5780: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20  configured. The 
5790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
57a0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
57f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e  */.static int.SN
5800: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  ICallback(const 
5810: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
5820: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
5830: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5840: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
5850: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
5860: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
5870: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
5880: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
5890: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
58a0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61  de, res;.    cha
58b0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20  r *servername = 
58c0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e  NULL;..    dprin
58d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
58e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
58f0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
5900: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5910: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5920: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5930: 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   Only works for 
5940: 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c  TLS 1.2 and earl
5950: 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65  ier */.    serve
5960: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f  rname = SSL_get_
5970: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
5980: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
5990: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  host_name);.    
59a0: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20  if (!servername 
59b0: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d  || servername[0]
59c0: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74   == '\0') {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
59e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
59f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5a00: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
5a10: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
5a20: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5a30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ERR_OK;.    }.. 
5a40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
5a50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
5a60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
5a70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
5a80: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
5a90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5aa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5ab0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e  NewStringObj("sn
5ad0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  i", -1));.    Tc
5ae0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5af0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5b00: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5b10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5b20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5b30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5b70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5b80: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20  gObj(servername 
5b90: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
5ba0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5bb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5bc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5bd0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5be0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5bf0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5c00: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5c10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5c20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5c30: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65  T_WARNING;..*ale
5c40: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5c50: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5c60: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5c70: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5c80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
5c90: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
5ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5cb0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
5cc0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5cd0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5ce0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  AL;..*alert = SS
5cf0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5d00: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5d10: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5d20: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  1.3 */.    }.   
5d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5d40: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5d50: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5d60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c  -------. *. * Cl
5db0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68  ientHello Handsh
5dc0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ake Callback for
5dd0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
5de0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72  *.Used by server
5df0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20   to examine the 
5e00: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
5e10: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74  cation (SNI) ext
5e20: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64  ension. *.provid
5e30: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74  ed by the client
5e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c   in order to sel
5e50: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ect an appropria
5e60: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  te certificate t
5e70: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e  o. *.present, an
5e80: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e  d make other con
5e90: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73  figuration adjus
5ea0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20  tments relevant 
5eb0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20  to that server. 
5ec0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63  *.name and its c
5ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
5ee0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70  is includes swap
5ef0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73  ping out the ass
5f00: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43  ociated. *.SSL_C
5f10: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69  TX pointer, modi
5f20: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  fying the server
5f30: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69  's list of permi
5f40: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e  tted TLS version
5f50: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74  s,. *.changing t
5f60: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68  he server's ciph
5f70: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f  er list in respo
5f80: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  nse to the clien
5f90: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c  t's cipher list,
5fa0: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20   etc.. *.Called 
5fb0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41  before SNI and A
5fc0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  LPN callbacks.. 
5fd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5fe0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5ff0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
6000: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
6010: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
6020: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
6030: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6040: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20  _RETRY: suspend 
6050: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61  the handshake, a
6060: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
6070: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
6080: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
6090: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  y. *.SSL_CLIENT_
60a0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69  HELLO_ERROR: fai
60b0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20  lure, terminate 
60c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20  connection. Set 
60d0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63  alert to error c
60e0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  ode.. *.SSL_CLIE
60f0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
6100: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d  : success. *. *-
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6160: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28  t.HelloCallback(
6170: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
6180: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64  int *alert, void
6190: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
61a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
61b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
61c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
61d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
61e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
61f0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
6200: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20  int code, res;. 
6210: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
6220: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63  ervername;.    c
6230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6240: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f  ar *p;.    size_
6250: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67  t len, remaining
6260: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
6270: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
6280: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
6290: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
62a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
62b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
62c0: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
62d0: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28  lse if (ssl == (
62e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c  const SSL *)NULL
62f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64   || arg == (void
6300: 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75   *)NULL) {..retu
6310: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6320: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6330: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d  ..    /* Get nam
6340: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53  es */.    if (!S
6350: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  SL_client_hello_
6360: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c  get0_ext(ssl, TL
6370: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72  SEXT_TYPE_server
6380: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61  _name, &p, &rema
6390: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e  ining) || remain
63a0: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
63b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
63c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
63d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
63e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6400: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
6410: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
6420: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74  he supplied list
6430: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20   of names. */.  
6440: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
6450: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
6460: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
6470: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d   (len + 2 != rem
6480: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72  aining) {..*aler
6490: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
64a0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
64b0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
64c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
64d0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
64e0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
64f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  en;..    /* The 
6500: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65  list in practice
6510: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67   only has a sing
6520: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77  le element, so w
6530: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20  e only consider 
6540: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a  the first one. *
6550: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6560: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b  ing == 0 || *p++
6570: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54   != TLSEXT_NAMET
6580: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b  YPE_host_name) {
6590: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
65a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
65b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
65c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
65d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
65e0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
65f0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  --;..    /* Now 
6600: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70  we can finally p
6610: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65  ull out the byte
6620: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
6630: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e  actual hostname.
6640: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6650: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
6660: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6670: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6680: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6690: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
66a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
66b0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
66c0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
66d0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
66e0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65  if (len + 2 > re
66f0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6700: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6710: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6720: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6730: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6750: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
6760: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ;.    servername
6770: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
6780: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  )p;..    /* Crea
6790: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
67a0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
67b0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
67c0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
67d0: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
67e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
67f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6810: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29  bj("hello", -1))
6820: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6830: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6840: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
6850: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
6860: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
6870: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
6880: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
6890: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
68a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
68b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
68c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
68d0: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c  vername, (int) l
68e0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
68f0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6900: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6910: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6920: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6930: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6940: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6950: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6960: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6970: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6980: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6990: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
69a0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
69b0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
69c0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
69d0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
69e0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
69f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6a00: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a10: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6a20: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6a30: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6a40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6a50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6a60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6a70: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6aa0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6ac0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6b10: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6b20: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6b30: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6b40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6b50: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6b60: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6b70: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6b80: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6b90: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6ba0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6bb0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6bc0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6bd0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6be0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6bf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6c00: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6c10: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6c20: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6c80: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6c90: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
6ca0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31  ", "ssl3", "tls1
6cb0: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ", "tls1.1", "tl
6cc0: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c  s1.2", "tls1.3",
6cd0: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72   NULL.};.enum pr
6ce0: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53  otocol {.    TLS
6cf0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
6d00: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54   TLS_TLS1, TLS_T
6d10: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_1, TLS_TLS1_
6d20: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54  2, TLS_TLS1_3, T
6d30: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74  LS_NONE.};..stat
6d40: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
6d50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
6d60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
6d70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6d80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6d90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6da0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
6db0: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
6dc0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
6dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
6de0: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
6df0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
6e00: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
6e10: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46  har *cp, buf[BUF
6e20: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e  SIZ];.    int in
6e30: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30  dex, verbose = 0
6e40: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20  , use_supported 
6e50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  = 0;.    const S
6e60: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
6e70: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
6e80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6e90: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
6ea0: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
6eb0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
6ec0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6ed0: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
6ee0: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
6ef0: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
6f00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6f10: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
6f20: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
6f30: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
6f40: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
6f50: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
6f60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f80: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
6f90: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
6fa0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
6fb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
6fc0: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
6fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6ff0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7000: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
7010: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7020: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
7030: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
7040: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7050: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7060: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7070: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7080: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
7090: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
70a0: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a  ..case TLS_SSL2:
70b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
70c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
70d0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
70e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
70f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7100: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20  L_NO_SSL2)..    
7110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7120: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7130: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7170: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7180: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d  method = SSLv2_m
7190: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
71a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
71b0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
71c0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
71d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71e0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
71f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7200: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  L3_METHOD)..    
7210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7220: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7230: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7240: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7250: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7270: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7280: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d  method = SSLv3_m
7290: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
72a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
72b0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
72c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
72d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
72e0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
72f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7300: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
7310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7320: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7330: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7340: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7350: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7360: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7370: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7380: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d  method = TLSv1_m
7390: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
73a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
73b0: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66  _TLS1_1:.#if def
73c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
73d0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
73e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  SL_NO_TLS1_1) ||
73f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7400: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
7410: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
7420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7430: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7440: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7450: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
7460: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7470: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7480: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7490: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28   TLSv1_1_method(
74a0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
74b0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
74c0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  2:.#if defined(N
74d0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
74e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
74f0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
7500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7510: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_2_METHOD)..  
7520: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7530: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7540: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
7550: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7560: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7570: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7580: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7590: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
75a0: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
75b0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
75c0: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
75d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
75e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
75f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7600: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7620: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7630: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7640: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7650: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7670: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7680: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20  TLS_method();.. 
7690: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
76a0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
76b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
76c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f  SION);..    SSL_
76d0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
76e0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
76f0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7700: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64  .    break;.#end
7710: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
7720: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d    method = TLS_m
7730: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72  ethod();..    br
7740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7750: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7760: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
7770: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20  f (ctx == NULL) 
7780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
77a0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
77b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
77c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d      }..    ssl =
77d0: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
77e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
77f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
7800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7810: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
7820: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
7830: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tx);..return TCL
7840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7850: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61     /* Use list a
7860: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c  nd order as woul
7870: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43  d be sent in a C
7880: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c  lientHello or al
7890: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  l available ciph
78a0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75  ers */.    if (u
78b0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
78c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73  .sk = SSL_get1_s
78d0: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73  upported_ciphers
78e0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (ssl);.    } els
78f0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  e {..sk = SSL_ge
7900: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  t_ciphers(ssl);.
7910: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
7920: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  k != NULL) {..if
7930: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20   (!verbose) {.. 
7940: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7950: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7960: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7970: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7990: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
79a0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
79b0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
79c0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
79d0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
79e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
79f0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7a00: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7a10: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7a20: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7a30: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7a40: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7a50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7a60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
7a80: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
7a90: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
7aa0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
7ab0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
7ac0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
7ad0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
7ae0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
7af0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
7b00: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
7b10: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
7b20: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
7b30: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
7b40: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
7b50: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
7b60: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
7b70: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
7b80: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
7b90: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
7ba0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
7bb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7bc0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
7bd0: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75   (int) strlen(bu
7be0: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  f));...} else {.
7bf0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7c00: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55  ToObj(objPtr, "U
7c10: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09  NKNOWN\n", 8);..
7c20: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  .}..    }..}..if
7c30: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
7c40: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43   {..    sk_SSL_C
7c50: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a  IPHER_free(sk);.
7c60: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  .}.    }.    SSL
7c70: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20  _free(ssl);.    
7c80: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
7c90: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
7ca0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
7cb0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
7cc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
7cd0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
7ce0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63  ---. *. * Protoc
7d40: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  olsObjCmd -- lis
7d50: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74  t available prot
7d60: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73  ocols. *. *.This
7d70: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
7d80: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
7d90: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f   the "tls::proto
7da0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  cols" command. *
7db0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
7dc0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  le protocols.. *
7dd0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7de0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7df0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
7e00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7e10: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
7e70: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
7e80: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7e90: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7ea0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7eb0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7ec0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7ed0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7ee0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
7ef0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7f00: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b  if (objc != 1) {
7f10: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7f20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7f30: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e  jv, "");..return
7f40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7f50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
7f60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f  _error();..    o
7f70: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7f80: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
7f90: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
7fa0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
7fb0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
7fc0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
7fd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7fe0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
7ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8010: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8020: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8030: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20  cols[TLS_SSL2], 
8040: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
8050: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8060: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
8070: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
8080: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8090: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
80a0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
80b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
80c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
80d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
80e0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
80f0: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  SSL3], -1));.#en
8100: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8110: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
8120: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8130: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
8140: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8150: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  S1_METHOD).    T
8160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
81a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31  ls[TLS_TLS1], -1
81b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
81c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
81d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
81e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
81f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8200: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
8210: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8230: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8240: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8250: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8260: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29  TLS_TLS1_1], -1)
8270: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8280: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
8290: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
82a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
82b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
82d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
82e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
82f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8300: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8310: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8320: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29  LS_TLS1_2], -1))
8330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
8350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
8370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8390: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
83a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
83b0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
83c0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _3], -1));.#endi
83d0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  f..    Tcl_SetOb
83e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
83f0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
8400: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
8410: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
8420: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
8480: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
8490: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
84a0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
84b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
84c0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
84d0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
84e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
84f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
8500: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
8510: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
8520: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
8530: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
8540: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
8550: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
8560: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
8570: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
85c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64  .static int Hand
85d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65  shakeObjCmd(Clie
85e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
85f0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8600: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8610: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8620: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
8630: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20  l_Channel chan; 
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
8650: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
8660: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
8670: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20  tate *statePtr; 
8680: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74         /* client
8690: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
86a0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  ocket */.    con
86b0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  st char *errStr 
86c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
86d0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ret = 1;.    int
86e0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64   err = 0;..    d
86f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
8700: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
8710: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
8720: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8730: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
8740: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
8750: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8760: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8770: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
8780: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
8790: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
87a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
87b0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
87c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
87d0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
87e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
87f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8810: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8820: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8830: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8840: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8850: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8860: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
8870: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
8880: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
8890: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
88a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
88b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
88c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
88d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
88e0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
88f0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
8900: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8910: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8920: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8930: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  KE", "CHANNEL", 
8940: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
8950: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
8960: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8970: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
8980: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
8990: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
89a0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
89b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
89c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
89d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
89e0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
89f0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
8a00: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
8a10: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
8a20: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
8a30: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
8a40: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
8a50: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
8a60: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8a70: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
8a80: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
8a90: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
8aa0: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
8ab0: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
8ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8ad0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53  ret < 0) {..errS
8ae0: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65  tr = statePtr->e
8af0: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65  rr;..Tcl_ResetRe
8b00: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54  sult(interp);..T
8b10: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29  cl_SetErrno(err)
8b20: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20  ;...if (!errStr 
8b30: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30  || (*errStr == 0
8b40: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72  )) {..    errStr
8b50: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f   = Tcl_PosixErro
8b60: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09  r(interp);..}...
8b70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8b80: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68  (interp, "handsh
8b90: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65  ake failed: ", e
8ba0: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20  rrStr, (char *) 
8bb0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8bc0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8bd0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8be0: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
8bf0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8c00: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8c10: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
8c20: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
8c30: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
8c40: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
8c50: 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ROR);.    } else
8c60: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30   {..if (err != 0
8c70: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
8c80: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
8c90: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20  ith a completed 
8ca0: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d  handshake: err =
8cb0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09   %i", err);..}..
8cc0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ret = 1;.    }..
8cd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
8ce0: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69  urning TCL_OK wi
8cf0: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c  th data \"%i\"",
8d00: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53   ret);.    Tcl_S
8d10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8d20: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
8d30: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74  j(ret));.    ret
8d40: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c  urn(TCL_OK);..cl
8d50: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
8d60: 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  tData;.}../*. *-
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
8dc0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
8dd0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
8de0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
8df0: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
8e00: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
8e10: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
8e20: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
8e30: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
8e40: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
8e50: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
8e60: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
8e70: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
8e80: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
8e90: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
8ea0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
8eb0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8f00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  /.static int.Imp
8f10: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
8f20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
8f30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8f40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8f50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8f60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
8f70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
8f80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
8f90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
8fa0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
8fb0: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
8fc0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
8fd0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   socket */.    S
8fe0: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20  SL_CTX *ctx.    
8ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9000: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
9010: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9020: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9030: 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20  sword.        = 
9040: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9050: 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20  j *vcmd.        
9060: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9070: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61  DString upperCha
9080: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c  nnelTranslation,
9090: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f   upperChannelBlo
90a0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  cking, upperChan
90b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70  nelEncoding, upp
90c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
90d0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c  ;.    int idx, l
90e0: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  en;.    int flag
90f0: 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53  s..        = TLS
9100: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69  _TCL_INIT;.    i
9110: 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20  nt server..     
9120: 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f     = 0;./* is co
9130: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e  nnection incomin
9140: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a  g or outgoing? *
9150: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66  /.    char *keyf
9160: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
9170: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
9180: 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  rtfile.        =
9190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
91a0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09  ned char *key  .
91b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
91c0: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20  key_len         
91d0: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
91e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
91f0: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e  cert         = N
9200: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72  ULL;.    int cer
9210: 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  t_len           
9220: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68       = 0;.    ch
9230: 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20  ar *ciphers.    
9240: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9250: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
9260: 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  es.        = NUL
9270: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
9280: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
9290: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
92a0: 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e  dir..        = N
92b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44  ULL;.    char *D
92c0: 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20  Hparams.        
92d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
92e0: 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20   *model..       
92f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
9300: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20  r *servername.  
9310: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a        = NULL;./*
9320: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65   hostname for Se
9330: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61  rver Name Indica
9340: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tion */.    cons
9350: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9360: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55  *session_id = NU
9370: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
9380: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *alpn..= NULL;. 
9390: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c     int ssl2 = 0,
93a0: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69   ssl3 = 0;.    i
93b0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73  nt tls1 = 1, tls
93c0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20  1_1 = 1, tls1_2 
93d0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b  = 1, tls1_3 = 1;
93e0: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d  .    int proto =
93f0: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a   0, level = -1;.
9400: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d      int verify =
9410: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c   0, require = 0,
9420: 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f   request = 1, po
9430: 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30  st_handshake = 0
9440: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9450: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
9460: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9470: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9480: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
9490: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
94a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
94b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
94c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
94d0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
94e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
94f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9500: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9510: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9520: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
9530: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9540: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
9550: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9560: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9570: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
9580: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
9590: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
95a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
95b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
95c0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
95d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
95e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
95f0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
9600: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
9610: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9620: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9630: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9640: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c  [1], NULL), NULL
9650: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
9660: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
9670: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
9680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9690: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
96a0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
96b0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
96c0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
96d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
96e0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
96f0: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20    for (idx = 2; 
9700: 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b  idx < objc; idx+
9710: 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20  +) {..char *opt 
9720: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9730: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d  romObj(objv[idx]
9740: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f  , NULL);...if (o
9750: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20  pt[0] != '-').. 
9760: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f     break;...OPTO
9770: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e  BJ("-alpn", alpn
9780: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64  );..OPTSTR("-cad
9790: 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50  ir", CAdir);..OP
97a0: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20  TSTR("-cafile", 
97b0: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54  CAfile);..OPTBYT
97c0: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c  E("-cert", cert,
97d0: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54   cert_len);..OPT
97e0: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c  STR("-certfile",
97f0: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54   certfile);..OPT
9800: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63  STR("-cipher", c
9810: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9820: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70  ("-ciphers", cip
9830: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
9840: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20  -ciphersuites", 
9850: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09  ciphersuites);..
9860: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
9870: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54  ", script);..OPT
9880: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c  STR("-dhparams",
9890: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54   DHparams);..OPT
98a0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79  BYTE("-key", key
98b0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54  , key_len);..OPT
98c0: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20  STR("-keyfile", 
98d0: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  keyfile);..OPTST
98e0: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65  R("-model", mode
98f0: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61  l);..OPTOBJ("-pa
9900: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72  ssword", passwor
9910: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70  d);..OPTBOOL("-p
9920: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20  ost_handshake", 
9930: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
9940: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75  ..OPTBOOL("-requ
9950: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a  est", request);.
9960: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69  .OPTBOOL("-requi
9970: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
9980: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74  OPTINT("-securit
9990: 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b  ylevel", level);
99a0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76  ..OPTBOOL("-serv
99b0: 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f  er", server);..O
99c0: 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61  PTSTR("-serverna
99d0: 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  me", servername)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73  ;..OPTSTR("-sess
99f0: 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e  ion_id", session
9a00: 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  _id);..OPTBOOL("
9a10: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09  -ssl2", ssl2);..
9a20: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c  OPTBOOL("-ssl3",
9a30: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl3);..OPTBOOL
9a40: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b  ("-tls1", tls1);
9a50: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9a60: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f  .1", tls1_1);..O
9a70: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22  PTBOOL("-tls1.2"
9a80: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42  , tls1_2);..OPTB
9a90: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74  OOL("-tls1.3", t
9aa0: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28  ls1_3);..OPTOBJ(
9ab0: 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e  "-validatecomman
9ac0: 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f  d", vcmd);..OPTO
9ad0: 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64  BJ("-vcmd", vcmd
9ae0: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74  );...OPTBAD("opt
9af0: 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63  ion", "-alpn, -c
9b00: 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d  adir, -cafile, -
9b10: 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c  cert, -certfile,
9b20: 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65   -cipher, -ciphe
9b30: 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e  rsuites, -comman
9b40: 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b  d, -dhparams, -k
9b50: 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d  ey, -keyfile, -m
9b60: 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c  odel, -password,
9b70: 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65   -post_handshake
9b80: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71  , -request, -req
9b90: 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c  uire, -securityl
9ba0: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d  evel, -server, -
9bb0: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73  servername, -ses
9bc0: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20  sion_id, -ssl2, 
9bd0: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74  -ssl3, -tls1, -t
9be0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20  ls1.1, -tls1.2, 
9bf0: 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c  -tls1.3, or -val
9c00: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a  idatecommand");.
9c10: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9c20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
9c30: 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69   (request)..veri
9c40: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
9c50: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53  _CLIENT_ONCE | S
9c60: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a  SL_VERIFY_PEER;.
9c70: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
9c80: 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69  && require).veri
9c90: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
9ca0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
9cb0: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72  _CERT;.    if (r
9cc0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
9cd0: 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79  andshake).verify
9ce0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   |= SSL_VERIFY_P
9cf0: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20  OST_HANDSHAKE;. 
9d00: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d     if (verify ==
9d10: 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53   0)..verify = SS
9d20: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
9d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
9d40: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
9d50: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
9d60: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
9d70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
9d80: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9d90: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
9da0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
9db0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9dc0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
9dd0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
9de0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
9df0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
9e00: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
9e10: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
9e20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
9e30: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
9e40: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
9e50: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
9e60: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
9e70: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
9e80: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09  )..        cert.
9e90: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9ea0: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21      if (key && !
9eb0: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b  *key)..        k
9ec0: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ey.        = NUL
9ed0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  L;.    if (certf
9ee0: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c  ile && !*certfil
9ef0: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66  e)         certf
9f00: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
9f10: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21  if (keyfile && !
9f20: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69  *keyfile)..keyfi
9f30: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9f40: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
9f50: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29  rs && !*ciphers)
9f60: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73  .        ciphers
9f70: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9f80: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
9f90: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65  uites && !*ciphe
9fa0: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73  rsuites) ciphers
9fb0: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b  uites    = NULL;
9fc0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
9fd0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20  && !*CAfile).   
9fe0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20       CAfile.    
9ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a000: 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43  if (CAdir && !*C
a010: 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41  Adir).        CA
a020: 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55  dir.        = NU
a030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61  LL;.    if (DHpa
a040: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61  rams && !*DHpara
a050: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61  ms).        DHpa
a060: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55  rams        = NU
a070: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20  LL;..    /* new 
a080: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  SSL state */.   
a090: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74   statePtr..= (St
a0a0: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28  ate *) ckalloc((
a0b0: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66  unsigned) sizeof
a0c0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65  (State));.    me
a0d0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30  mset(statePtr, 0
a0e0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  , sizeof(State))
a0f0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
a100: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a  >flags.= flags;.
a110: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e      statePtr->in
a120: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20  terp.= interp;. 
a130: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c     statePtr->vfl
a140: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20  ags.= verify;.  
a150: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09    statePtr->err.
a160: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c  = "";..    /* al
a170: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f  locate script */
a180: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29  .    if (script)
a190: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
a1a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a1b0: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09  script, &len);..
a1c0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a1d0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a1e0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20  ck = script;..  
a1f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a200: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
a210: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  lback);..}.    }
a220: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a230: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
a240: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20    if (password) 
a250: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a260: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
a270: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a  assword, &len);.
a280: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a290: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
a2a0: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a  ord = password;.
a2b0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a2c0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a2d0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
a2e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a2f0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f  cate validate co
a300: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20  mmand */.    if 
a310: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29  (vcmd) {..(void)
a320: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a330: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e  omObj(vcmd, &len
a340: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a350: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63      statePtr->vc
a360: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20  md = vcmd;..    
a370: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a380: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
a390: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a3a0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
a3b0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
a3c0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
a3d0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
a3e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
a3f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
a400: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
a410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
a420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
a430: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a440: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a450: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a460: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
a470: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  .. * Make sure t
a480: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
a490: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
a4a0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  .. */..chan = Tc
a4b0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
a4c0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f  chan);..if (Tcl_
a4d0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
a4e0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
a4f0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20  nelType()) {..  
a500: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a510: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
a520: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
a530: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
a540: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
a550: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
a560: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  , NULL);..    Tc
a570: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a580: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a590: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c  MPORT", "CHANNEL
a5a0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
a5b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a5c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
a5d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
a5e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a5f0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
a600: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
a610: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
a620: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
a630: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
a640: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
a650: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
a660: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
a670: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
a680: 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f   key, cert, key_
a690: 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c  len,..    cert_l
a6a0: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
a6b0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
a6c0: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
a6d0: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
a6e0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a6f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a700: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a720: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
a730: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
a740: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
a750: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
a760: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a770: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
a780: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
a790: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
a7a0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
a7b0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
a7c0: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
a7d0: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
a7e0: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
a7f0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
a800: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
a810: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
a820: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
a830: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
a840: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
a850: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
a860: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
a870: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
a880: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a890: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
a8a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
a8b0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
a8c0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
a8d0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
a8e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
a8f0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
a900: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
a910: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
a920: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
a930: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
a940: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
a950: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
a960: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
a970: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
a980: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
a990: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
a9a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
a9b0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
a9c0: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
a9d0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
a9e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
a9f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
aa00: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
aa10: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
aa20: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
aa30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
aa40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
aa50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
aa60: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
aa70: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
aa80: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
aa90: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
aaa0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
aab0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
aac0: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
aad0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
aae0: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
aaf0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
ab00: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
ab10: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
ab20: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
ab30: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
ab40: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
ab50: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
ab60: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
ab70: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
ab80: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
ab90: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
aba0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
abb0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
abc0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
abd0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
abe0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
abf0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
ac00: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
ac10: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
ac20: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
ac30: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63   */..Tls_Free((c
ac40: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
ac50: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
ac60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ac70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
ac80: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
ac90: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
aca0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
acb0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
acc0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
acd0: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
ace0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
acf0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ad00: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
ad10: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
ad20: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ad30: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
ad40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ad50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ad60: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
ad70: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
ad80: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
ad90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
ada0: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
adb0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
adc0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
add0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
ade0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
adf0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
ae00: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
ae10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
ae20: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
ae30: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
ae40: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
ae50: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
ae60: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
ae70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
ae80: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
ae90: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
aea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
aeb0: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
aec0: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
aed0: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  on: ", REASON(),
aee0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
aef0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
af00: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
af10: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
af20: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22  "INIT", "FAILED"
af30: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
af40: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ;..Tls_Free((cha
af50: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
af60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
af70: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
af80: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72   Set host server
af90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20   name */.    if 
afa0: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09  (servername) {..
afb0: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76  /* Sets the serv
afc0: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69  er name indicati
afd0: 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65  on (SNI) in Clie
afe0: 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f  ntHello extensio
aff0: 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43  n */../* Per RFC
b000: 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20   6066, hostname 
b010: 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64  is a ASCII encod
b020: 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 09 69  ed string. */..i
b030: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65  f (!SSL_set_tlse
b040: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61  xt_host_name(sta
b050: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
b060: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69  ername) && requi
b070: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  re) {..    Tcl_A
b080: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b090: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53  rp, "setting TLS
b0a0: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e   host name exten
b0b0: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63  sion failed", (c
b0c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b0d0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b0e0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b0f0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e  ", "IMPORT", "SN
b100: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  I", "FAILED", (c
b110: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b120: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
b130: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b140: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b150: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  ERROR;..}.../* C
b160: 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 72 20  onfigure server 
b170: 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 6b 73  host name checks
b180: 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c 69 65   in the SSL clie
b190: 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f 73 74  nt. Set DNS host
b1a0: 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 6d 65  name to..   name
b1b0: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66   for peer certif
b1c0: 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 53 53  icate checks. SS
b1d0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 73 20  L_set1_host has 
b1e0: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a  limitations. */.
b1f0: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68  .if (!SSL_add1_h
b200: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ost(statePtr->ss
b210: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20  l, servername)) 
b220: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b230: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b240: 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73  "setting DNS hos
b250: 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20  t name failed", 
b260: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b270: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
b280: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
b290: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
b2a0: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c  HOSTNAME", "FAIL
b2b0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b2c0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
b2d0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b2e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b2f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b300: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
b310: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64  esume session id
b320: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73   */.    if (sess
b330: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e  ion_id && strlen
b340: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20  (session_id) <= 
b350: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f  SSL_MAX_SID_CTX_
b360: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53  LENGTH) {../* SS
b370: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20  L_set_session() 
b380: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53  */..if (!SSL_SES
b390: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e  SION_set1_id_con
b3a0: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73  text(SSL_get_ses
b3b0: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
b3c0: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  sl), session_id,
b3d0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
b3e0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b3f0: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  d))) {..    Tcl_
b400: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b410: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73  erp, "Resume ses
b420: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69  sion id ", sessi
b430: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22  on_id, " failed"
b440: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b450: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b460: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b470: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b480: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49   "SESSION", "FAI
b490: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b4a0: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
b4b0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b4c0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20   *) statePtr);. 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
b4e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b4f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61      }..    if (a
b500: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65  lpn) {../* Conve
b510: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e  rt a TCL list in
b520: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  to a protocol-li
b530: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61  st in wire-forma
b540: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63  t */..unsigned c
b550: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b  har *protos, *p;
b560: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70  ..unsigned int p
b570: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09  rotos_len = 0;..
b580: 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b  int i, len, cnt;
b590: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74  ..Tcl_Obj **list
b5a0: 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  ;...if (Tcl_List
b5b0: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
b5c0: 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e  nterp, alpn, &cn
b5d0: 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c  t, &list) != TCL
b5e0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  _OK) {..    Tls_
b5f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b600: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b620: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
b630: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
b640: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72  uired for the pr
b650: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
b660: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
b670: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
b680: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
b690: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26  omObj(list[i], &
b6a0: 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c  len);..    if (l
b6b0: 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63  en > 255) {...Tc
b6c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b6d0: 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f  nterp, "ALPN pro
b6e0: 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c  tocol name too l
b6f0: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ong", (char *) N
b700: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45  ULL);...Tcl_SetE
b710: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b720: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b730: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
b740: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
b750: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28  L);...Tls_Free((
b760: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
b770: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
b780: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
b790: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d     protos_len +=
b7a0: 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f   1 + len;..}.../
b7b0: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
b7c0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  lete protocol-li
b7d0: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20  st */..protos = 
b7e0: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c  ckalloc(protos_l
b7f0: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f  en);../* protoco
b800: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20  l-lists consist 
b810: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d  of 8-bit length-
b820: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73  prefixed, byte s
b830: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28  trings */..for (
b840: 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f  i = 0, p = proto
b850: 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29  s; i < cnt; i++)
b860: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74   {..    char *st
b870: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
b880: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
b890: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70  , &len);..    *p
b8a0: 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d  ++ = len;..    m
b8b0: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65  emcpy(p, str, le
b8c0: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65  n);..    p += le
b8d0: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73  n;..}.../* SSL_s
b8e0: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d  et_alpn_protos m
b8f0: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74  akes a copy of t
b900: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  he protocol-list
b910: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68   */../* Note: Th
b920: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76  is functions rev
b930: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e  erses the return
b940: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f   value conventio
b950: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65  n */..if (SSL_se
b960: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74  t_alpn_protos(st
b970: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f  atePtr->ssl, pro
b980: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29  tos, protos_len)
b990: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
b9a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b9b0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74  , "failed to set
b9c0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22   ALPN protocols"
b9d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b9e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b9f0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
ba00: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
ba10: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
ba20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
ba30: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
ba40: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
ba50: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
ba60: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
ba70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ba80: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
ba90: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
baa0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bab0: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
bac0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
bad0: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
bae0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
baf0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
bb00: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
bb10: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
bb20: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
bb30: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
bb40: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
bb50: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
bb60: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
bb70: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
bb80: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
bb90: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
bba0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
bbb0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
bbc0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
bbd0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73  back);.    SSL_s
bbe0: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b  et_info_callback
bbf0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bc00: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  InfoCallback);..
bc10: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
bc20: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72  for observing pr
bc30: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20  otocol messages 
bc40: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
bc50: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
bc60: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f      /* void SSL_
bc70: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
bc80: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74  back_arg(statePt
bc90: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
bca0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76  statePtr);.    v
bcb0: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
bcc0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
bcd0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73  tePtr->ctx, Mess
bce0: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f  ageCallback); */
bcf0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67  .    SSL_set_msg
bd00: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
bd10: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
bd20: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
bd30: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
bd40: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
bd50: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43  r->ssl, MessageC
bd60: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66  allback);.#endif
bd70: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
bd80: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20  Tcl_Channel BIO 
bd90: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73  Handler */.    s
bda0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d  tatePtr->p_bio.=
bdb0: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61   BIO_new_tcl(sta
bdc0: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  tePtr, BIO_NOCLO
bdd0: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  SE);.    statePt
bde0: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  r->bio.= BIO_new
bdf0: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a  (BIO_f_ssl());..
be00: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20      if (server) 
be10: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c  {../* Server cal
be20: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43  lbacks */..SSL_C
be30: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65  TX_set_tlsext_se
be40: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61  rvername_arg(sta
be50: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
be60: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
be70: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
be80: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61  xt_servername_ca
be90: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
bea0: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63  >ctx, SNICallbac
beb0: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  k);..SSL_CTX_set
bec0: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62  _client_hello_cb
bed0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bee0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  HelloCallback, (
bef0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
bf00: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  ;..if (statePtr-
bf10: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
bf20: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
bf30: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f  set_alpn_select_
bf40: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
bf50: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
bf60: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
bf70: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  );.#ifdef USE_NP
bf80: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f  N..    if (tls1_
bf90: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33  2 == 0 && tls1_3
bfa0: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43   == 0) {...SSL_C
bfb0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
bfc0: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62  os_advertised_cb
bfd0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bfe0: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  NPNCallback, (vo
bff0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c000: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d  .    }.#endif..}
c010: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72  .../* Enable ser
c020: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74  ver to send cert
c030: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68   request after h
c040: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e  andshake (TLS 1.
c050: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41  3 only) */../* A
c060: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
c070: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65   must take place
c080: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69   for the Certifi
c090: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20  cate Request to 
c0a0: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74  be..   sent to t
c0b0: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20  he client, this 
c0c0: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68  can be done with
c0d0: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b   SSL_do_handshak
c0e0: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  e(). */..if (req
c0f0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
c100: 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53  dshake) {..    S
c110: 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74  SL_verify_client
c120: 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28  _post_handshake(
c130: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
c140: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76  .}.../* Set serv
c150: 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74  er mode */..stat
c160: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
c170: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09  LS_TCL_SERVER;..
c180: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73  SSL_set_accept_s
c190: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
c1a0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
c1b0: 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c  {../* Client cal
c1c0: 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66  lbacks */.#ifdef
c1d0: 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74   USE_NPN..if (st
c1e0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
c1f0: 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32  = NULL && tls1_2
c200: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
c210: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c  == 0) {..    SSL
c220: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
c230: 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74  oto_select_cb(st
c240: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50  atePtr->ctx, ALP
c250: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
c260: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d   *)statePtr);..}
c270: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73  .#endif.../* Ses
c280: 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a  sion caching */.
c290: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73  .SSL_CTX_set_ses
c2a0: 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
c2b0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c2c0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
c2d0: 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f  IENT | SSL_SESS_
c2e0: 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41  CACHE_NO_INTERNA
c2f0: 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43  L_STORE);..SSL_C
c300: 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f  TX_sess_set_new_
c310: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c320: 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  , SessionCallbac
c330: 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  k);.../* Enable 
c340: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41  post handshake A
c350: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78  uthentication ex
c360: 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33  tension. TLS 1.3
c370: 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f   only, not http/
c380: 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  2. */..if (reque
c390: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
c3a0: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
c3b0: 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  _set_post_handsh
c3c0: 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74  ake_auth(statePt
c3d0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a  r->ssl, 1);..}..
c3e0: 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d  ./* Set client m
c3f0: 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ode */..SSL_set_
c400: 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74  connect_state(st
c410: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
c420: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f    }.    SSL_set_
c430: 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  bio(statePtr->ss
c440: 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  l, statePtr->p_b
c450: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  io, statePtr->p_
c460: 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65  bio);.    BIO_se
c470: 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e  t_ssl(statePtr->
c480: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  bio, statePtr->s
c490: 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  sl, BIO_NOCLOSE)
c4a0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
c4b0: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74   End of SSL Init
c4c0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
c4d0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
c4e0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
c4f0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
c500: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63  ->self));.    Tc
c510: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
c520: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c  rp, (char *) Tcl
c530: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c540: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
c550: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c560: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c570: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
c580: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
c590: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
c5a0: 2d 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 0a 20 2a 0a 20 2a  ----------. *. *
c5e0: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   UnimportObjCmd 
c5f0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
c600: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
c610: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
c620: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
c630: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52   filter.. *. * R
c640: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
c650: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
c660: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
c670: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
c680: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
c690: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
c6a0: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
c6f0: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
c700: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
c710: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
c720: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c730: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
c740: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
c750: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
c760: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
c770: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
c780: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
c790: 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  */..    dprintf(
c7a0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
c7b0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
c7c0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
c7d0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c7e0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
c7f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
c800: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  R;.    }..    ch
c810: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
c820: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
c830: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c840: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
c850: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
c860: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
c870: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
c880: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
c890: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
c8a0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
c8b0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
c8c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
c8d0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
c8e0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63  an);..    if (Tc
c8f0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
c900: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
c910: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
c920: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c930: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
c940: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
c950: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
c960: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
c970: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
c980: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
c990: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
c9a0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49  erp, "TLS", "UNI
c9b0: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c  MPORT", "CHANNEL
c9c0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
c9d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
c9e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c9f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
ca00: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e  Tcl_UnstackChann
ca10: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
ca20: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b   == TCL_ERROR) {
ca30: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ca40: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  OR;.    }..    r
ca50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
ca60: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
ca70: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
ca80: 2a 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 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cac0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
cad0: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
cae0: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
caf0: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
cb00: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
cb10: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
cb20: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
cb30: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
cb40: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
cb50: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
cb60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
cbb0: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e  SSL_CTX *.CTX_In
cbc0: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  it(State *stateP
cbd0: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72  tr, int isServer
cbe0: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
cbf0: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72  r *keyfile, char
cc00: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20   *certfile,.    
cc10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
cc20: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ey, unsigned cha
cc30: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79  r *cert, int key
cc40: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c  _len, int cert_l
cc50: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c  en, char *CAdir,
cc60: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
cc70: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
cc80: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
cc90: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
cca0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
ccb0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
ccc0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
ccd0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
cce0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
ccf0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
cd00: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54  String ds;.    T
cd10: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a  cl_DString ds1;.
cd20: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b      int off = 0;
cd30: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72  .    int load_pr
cd40: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63  ivate_key;.    c
cd50: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
cd60: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
cd70: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
cd80: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f  ..    if (!proto
cd90: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
cda0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
cdb0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  o valid protocol
cdc0: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c   selected", NULL
cdd0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
cde0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63  .    }..    /* c
cdf0: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78  reate SSL contex
ce00: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  t */.#if OPENSSL
ce10: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
ce20: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c  >= 0x10100000L |
ce30: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  | defined(NO_SSL
ce40: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
ce50: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
ce60: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
ce70: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
ce80: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL2)) {..Tcl_Ap
ce90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
cea0: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f  p, "SSL2 protoco
ceb0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
cec0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
ced0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
cee0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
cef0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
cf00: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
cf10: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL3).    if (ENA
cf20: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
cf30: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09  PROTO_SSL3)) {..
cf40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cf50: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70  (interp, "SSL3 p
cf60: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
cf70: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
cf80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
cf90: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
cfa0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
cfb0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
cfc0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69  L_NO_TLS1).    i
cfd0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
cfe0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
cff0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d010: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c  TLS 1.0 protocol
d020: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d030: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d040: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d050: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d060: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
d070: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d080: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28  TLS1_1).    if (
d090: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d0a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29  LS_PROTO_TLS1_1)
d0b0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d0c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d0d0: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.1 protocol 
d0e0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d0f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d100: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d110: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d120: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
d130: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d140: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45  LS1_2).    if (E
d150: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d160: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29  S_PROTO_TLS1_2))
d170: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d180: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d190: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.2 protocol n
d1a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
d1b0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d1c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d1d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d1e0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
d1f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d200: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_3).    if (EN
d210: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d220: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20  _PROTO_TLS1_3)) 
d230: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d240: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
d250: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.3 protocol no
d260: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
d270: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d280: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d290: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
d2a0: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75   0) {../* Use fu
d2b0: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c  ll range */..SSL
d2c0: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
d2d0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
d2e0: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  0);..SSL_CTX_set
d2f0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
d300: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  on(ctx, 0);.    
d310: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  }..    switch (p
d320: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
d330: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
d340: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
d350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
d360: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
d370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d380: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
d390: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
d3a0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d3b0: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65   SSLv2_server_me
d3c0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63  thod() : SSLv2_c
d3d0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d3e0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
d3f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
d400: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
d410: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d420: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d430: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
d440: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
d450: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09  LS_PROTO_SSL3:..
d460: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d470: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72  r ? SSLv3_server
d480: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
d490: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  3_client_method(
d4a0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d4b0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d4c0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
d4d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d4e0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
d4f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d500: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
d510: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
d520: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d530: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72  rver ? TLSv1_ser
d540: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d550: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  LSv1_client_meth
d560: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d570: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d580: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
d590: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d5a0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
d5b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d5c0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
d5d0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
d5e0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65  ROTO_TLS1_1:..me
d5f0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
d600: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72  ? TLSv1_1_server
d610: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
d620: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_1_client_metho
d630: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d640: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d650: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
d660: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d670: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
d680: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d690: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
d6a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d6b0: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74  OTO_TLS1_2:..met
d6c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d6d0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f   TLSv1_2_server_
d6e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
d6f0: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _2_client_method
d700: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d710: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d720: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
d730: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d740: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
d750: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
d760: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65  1_3:../* Use the
d770: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20   generic method 
d780: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  and constraint r
d790: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65  ange after conte
d7a0: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f  xt is created */
d7b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d7c0: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
d7d0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
d7e0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
d7f0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d800: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
d810: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
d820: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
d830: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
d840: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d850: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
d860: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
d870: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d880: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
d890: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
d8a0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
d8b0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
d8c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d8d0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
d8e0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
d8f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
d900: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
d910: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
d920: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d930: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
d940: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d950: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
d960: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d970: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
d980: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
d990: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
d9a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d9b0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
d9c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d9d0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
d9e0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d9f0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
da00: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
da10: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
da20: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
da30: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
da40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
da50: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
da60: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
da70: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
da80: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
da90: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
daa0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
dab0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
dac0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dad0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
dae0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
daf0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
db00: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
db10: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
db20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
db30: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
db40: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
db50: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
db60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
db70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
db80: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
db90: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
dba0: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
dbb0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
dbc0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78  rror();..    ctx
dbd0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
dbe0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
dbf0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28  !ctx) {..return(
dc00: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NULL);.    }..  
dc10: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c    if (getenv(SSL
dc20: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09  KEYLOGFILE)) {..
dc30: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c  SSL_CTX_set_keyl
dc40: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c  og_callback(ctx,
dc50: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29   KeyLogCallback)
dc60: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
dc70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
dc80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dc90: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
dca0: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
dcb0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
dcc0: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  3) {..SSL_CTX_se
dcd0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
dce0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
dcf0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43  VERSION);..SSL_C
dd00: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
dd10: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
dd20: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  S1_3_VERSION);. 
dd30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
dd40: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72   /* Force cipher
dd50: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72   selection order
dd60: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20   by server */.  
dd70: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29    if (!isServer)
dd80: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
dd90: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
dda0: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45  _OP_CIPHER_SERVE
ddb0: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20  R_PREFERENCE);. 
ddc0: 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54     }..    SSL_CT
ddd0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
dde0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
ddf0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
de00: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
de10: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
de20: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
de30: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
de40: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
de50: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
de60: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
de70: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f  ns(ctx, off);../
de80: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63  * disable protoc
de90: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23  ol versions */.#
dea0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
deb0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
dec0: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f  101000L.    SSL_
ded0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78  CTX_set_mode(ctx
dee0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f  , SSL_MODE_AUTO_
def0: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c  RETRY);./* handl
df00: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73  e new handshakes
df10: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20   in background. 
df20: 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e  On by default in
df30: 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20   OpenSSL 1.1.1. 
df40: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53  */.#endif.    SS
df50: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63  L_CTX_sess_set_c
df60: 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31  ache_size(ctx, 1
df70: 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  28);..    /* Set
df80: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69   user defined ci
df90: 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75  phers, cipher su
dfa0: 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69  ites, and securi
dfb0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
dfc0: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20  if ((ciphers != 
dfd0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54  NULL) && !SSL_CT
dfe0: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  X_set_cipher_lis
dff0: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29  t(ctx, ciphers))
e000: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e010: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
e020: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64  t ciphers failed
e030: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
e040: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
e050: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
e060: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
e070: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
e080: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74   if ((ciphersuit
e090: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  es != NULL) && !
e0a0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
e0b0: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69  ersuites(ctx, ci
e0c0: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09  phersuites)) {..
e0d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e0e0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
e0f0: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c  pher suites fail
e100: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
e110: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
e120: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
e130: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
e140: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
e150: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72      /* Set secur
e160: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
e170: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20   if (level > -1 
e180: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a  && level < 6) {.
e190: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75  ./* SSL_set_secu
e1a0: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53  rity_level */..S
e1b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72  SL_CTX_set_secur
e1c0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c  ity_level(ctx, l
e1d0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  evel);.    }..  
e1e0: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61    /* set some ca
e1f0: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53  llbacks */.    S
e200: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e210: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78  lt_passwd_cb(ctx
e220: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  , PasswordCallba
e230: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ck);.    SSL_CTX
e240: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
e250: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
e260: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
e270: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
e280: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65  read a Diffie-He
e290: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73  llman parameters
e2a0: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68   file, or use th
e2b0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a  e built-in one *
e2c0: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  /.#ifdef OPENSSL
e2d0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44  _NO_DH.    if (D
e2e0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
e2f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48  sult(interp, "DH
e310: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f   parameter suppo
e320: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rt not available
e330: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e340: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e350: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e360: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  ULL;.    }.#else
e370: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a  .    {..DH* dh;.
e380: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d  .if (DHparams !=
e390: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49   NULL) {..    BI
e3a0: 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c  O *bio;..    Tcl
e3b0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
e3c0: 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49  );..    bio = BI
e3d0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44  O_new_file(F2N(D
e3e0: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22  Hparams, &ds), "
e3f0: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62  r");..    if (!b
e400: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72  io) {...Tcl_DStr
e410: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
e420: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e430: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
e440: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61  not find DH para
e450: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63  meters file", (c
e460: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
e470: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e480: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
e490: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64  ;..    }...    d
e4a0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f  h = PEM_read_bio
e4b0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e  _DHparams(bio, N
e4c0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
e4d0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
e4e0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  bio);..    Tcl_D
e4f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
e500: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b  ..    if (!dh) {
e510: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
e520: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
e530: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70  ld not read DH p
e540: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66  arameters from f
e550: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ile", (char *) N
e560: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e570: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e580: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e590: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
e5a0: 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d  dh = get_dhParam
e5b0: 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58  s();..}..SSL_CTX
e5c0: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
e5d0: 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64   dh);..DH_free(d
e5e0: 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  h);.    }.#endif
e5f0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
e600: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
e610: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
e620: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
e630: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
e640: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
e650: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54  ate_key = 1;...T
e660: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
e670: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  ds);...if (SSL_C
e680: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
e690: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  te_file(ctx, F2N
e6a0: 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c  (certfile, &ds),
e6b0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
e6c0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  M) <= 0) {..    
e6d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e6e0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
e6f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e700: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e710: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
e720: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
e730: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
e740: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
e750: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
e760: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e770: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
e780: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
e790: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
e7a0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
e7b0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
e7c0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
e7d0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
e7e0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72  x, cert_len, cer
e7f0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  t) <= 0) {..    
e800: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e810: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
e820: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e830: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e840: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
e850: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
e860: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
e870: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
e880: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
e890: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
e8a0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
e8b0: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
e8c0: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
e8d0: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
e8e0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
e8f0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
e900: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
e910: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
e920: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
e930: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  0..    Tcl_DStri
e940: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
e950: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e960: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
e970: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
e980: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
e990: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
e9a0: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45  ": ",....     RE
e9b0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e9c0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
e9d0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e9e0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
e9f0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20  ;.#endif..}.    
ea00: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  }..    /* set ou
ea10: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f  r private key */
ea20: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72  .    if (load_pr
ea30: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66  ivate_key) {..if
ea40: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
ea50: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c  L && key == NULL
ea60: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65  ) {..    keyfile
ea70: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a   = certfile;..}.
ea80: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d  ..if (keyfile !=
ea90: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
eaa0: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65   get the private
eab0: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
eac0: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66  with this certif
ead0: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66  icate */..    if
eae0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
eaf0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d  L) {...keyfile =
eb00: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20   certfile;..    
eb10: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  }...    if (SSL_
eb20: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
eb30: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  ey_file(ctx, F2N
eb40: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20  (keyfile, &ds), 
eb50: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
eb60: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
eb70: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
eb80: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
eb90: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
eba0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
ebb0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
ebc0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
ebd0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
ebe0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
ebf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ec00: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
ec10: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
ec20: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
ec30: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20  , " ",....      
ec40: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
ec50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
ec60: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ec70: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
ec80: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
ec90: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
eca0: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
ecb0: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key != NULL) {..
ecc0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
ecd0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41  use_PrivateKey_A
ece0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41  SN1(EVP_PKEY_RSA
ecf0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c  , ctx, key,key_l
ed00: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  en) <= 0) {...Tc
ed10: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
ed20: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
ed30: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
ed40: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
ed50: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
ed60: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
ed70: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
ed80: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
ed90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
eda0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
edb0: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
edc0: 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ey: ", REASON(),
edd0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ede0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
edf0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ee00: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
ee10: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
ee20: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
ee30: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
ee40: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
ee50: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
ee60: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
ee70: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
ee80: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
ee90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eea0: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
eeb0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
eec0: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
eed0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
eee0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
eef0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
ef00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ef10: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
ef20: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
ef30: 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69  * Set verificati
ef40: 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63  on CAs */.    Tc
ef50: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
ef60: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
ef70: 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20  ingInit(&ds1);. 
ef80: 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f     /* There is o
ef90: 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  ne default direc
efa0: 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c  tory, one defaul
efb0: 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20  t file, and one 
efc0: 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09  default store...
efd0: 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63  The default CA c
efe0: 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65  ertificates dire
eff0: 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75  ctory (and defau
f000: 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20  lt store) is in 
f010: 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72  the OpenSSL..cer
f020: 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74  ts directory. It
f030: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
f040: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
f050: 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20  RT_DIR env var. 
f060: 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20  The..default CA 
f070: 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c  certificates fil
f080: 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74  e is called cert
f090: 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61  .pem in the defa
f0a0: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72  ult OpenSSL..dir
f0b0: 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62  ectory. It can b
f0c0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
f0d0: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c  the SSL_CERT_FIL
f0e0: 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f  E env var. */../
f0f0: 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65  * int SSL_CTX_se
f100: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79  t_default_verify
f110: 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74  _dir(SSL_CTX *ct
f120: 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43  x) and int SSL_C
f130: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
f140: 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43  erify_file(SSL_C
f150: 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20  TX *ctx) */.    
f160: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
f170: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f  d_verify_locatio
f180: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69  ns(ctx, F2N(CAfi
f190: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41  le, &ds), F2N(CA
f1a0: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09  dir, &ds1)) ||..
f1b0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
f1c0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
f1d0: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a  s(ctx)) {.#if 0.
f1e0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
f1f0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72  (&ds);..Tcl_DStr
f200: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09  ingFree(&ds1);..
f210: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74  /* Don't current
f220: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20  ly care if this 
f230: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70  fails */..Tcl_Ap
f240: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f250: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20  p, "SSL default 
f260: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c  verify paths: ",
f270: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
f280: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
f290: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f2a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e  return NULL;.#en
f2b0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
f2c0: 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65  * https://source
f2d0: 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f  forge.net/p/tls/
f2e0: 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20  bugs/57/ */.    
f2f0: 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74  /* XXX:TODO: Let
f300: 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79   the user supply
f310: 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73   values here ins
f320: 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e  tead of somethin
f330: 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e  g that exists on
f340: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
f350: 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  */.    if (CAfil
f360: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54  e != NULL) {..ST
f370: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
f380: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
f390: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
f3a0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
f3b0: 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63  e, &ds));..if (c
f3c0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
f3d0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ) {..    SSL_CTX
f3e0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _set_client_CA_l
f3f0: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d  ist(ctx, certNam
f400: 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  es);..}.    }.. 
f410: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f420: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c  ee(&ds);.    Tcl
f430: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f440: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63  1);.    return c
f450: 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tx;.}.../*. *---
f460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f4a0: 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a  . *. * StatusObj
f4b0: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65  Cmd -- return ce
f4c0: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f  rtificate for co
f4d0: 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a  nnected peer.. *
f4e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
f4f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
f500: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
f510: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
f520: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
f570: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74  .static int.Stat
f580: 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  usObjCmd(ClientD
f590: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
f5a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f5b0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
f5c0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
f5d0: 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65  v[]) {.    State
f5e0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
f5f0: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20  X509 *peer;.    
f600: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
f610: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
f620: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20   chan;.    char 
f630: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63  *channelName, *c
f640: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20  iphers;.    int 
f650: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  mode;.    const 
f660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
f670: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  roto;.    unsign
f680: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20  ed int len;.    
f690: 69 6e 74 20 6e 69 64 3b 0a 0a 20 20 20 20 64 70  int nid;..    dp
f6a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
f6b0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f 62  ..    switch (ob
f6c0: 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09  jc) {..case 2:..
f6d0: 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20      channelName 
f6e0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6f0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
f700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
f710: 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20  k;...case 3:..  
f720: 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28 54    if (!strcmp (T
f730: 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62  cl_GetString (ob
f740: 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22  jv[1]), "-local"
f750: 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61  )) {...channelNa
f760: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
f770: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f780: 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61  ], NULL);...brea
f790: 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f  k;..    }..    /
f7a0: 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 6f  * else fall-thro
f7b0: 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64  ugh ... */.#if d
f7c0: 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29  efined(__GNUC__)
f7d0: 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62 75 74  ..    __attribut
f7e0: 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 68  e__((fallthrough
f7f0: 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61  ));.#endif..defa
f800: 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72  ult:..    Tcl_Wr
f810: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f820: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c  p, 1, objv, "?-l
f830: 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b  ocal? channel");
f840: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
f850: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
f860: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
f870: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
f880: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d   channelName, &m
f890: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ode);.    if (ch
f8a0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
f8b0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
f8c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f8d0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b 65     }.    /* Make
f8e0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
f8f0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
f900: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
f910: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
f920: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
f930: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
f940: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
f950: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
f960: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
f970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f980: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
f990: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
f9a0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
f9b0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
f9c0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
f9d0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
f9e0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
f9f0: 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e   "STATUS", "CHAN
fa00: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
fa10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
fa20: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
fa30: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  OR;.    }.    st
fa40: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
fa50: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
fa60: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
fa70: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  an);..    /* Get
fa80: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
fa90: 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f   peer or self */
faa0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
fab0: 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53   2) {..peer = SS
fac0: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69  L_get_peer_certi
fad0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
fae0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
faf0: 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  e {..peer = SSL_
fb00: 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28  get_certificate(
fb10: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
fb20: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74      }.    /* Get
fb30: 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74   X509 certificat
fb40: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  e info */.    if
fb50: 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74   (peer) {..objPt
fb60: 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  r = Tls_NewX509O
fb70: 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29  bj(interp, peer)
fb80: 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32  ;..if (objc == 2
fb90: 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72  ) {..    X509_fr
fba0: 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70  ee(peer);..    p
fbb0: 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eer = NULL;..}. 
fbc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a     } else {..obj
fbd0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
fbe0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
fbf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65     }..    /* Pee
fc00: 72 20 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c  r cert chain (cl
fc10: 69 65 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20  ient only) */.  
fc20: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29    STACK_OF(X509)
fc30: 2a 20 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53  * ssl_certs = SS
fc40: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f  L_get_peer_cert_
fc50: 63 68 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e  chain(statePtr->
fc60: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 73  ssl);.    if (ss
fc70: 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 20  l_certs == NULL 
fc80: 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 73  || sk_X509_num(s
fc90: 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 30 29 20  sl_certs) == 0) 
fca0: 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  {..Tcl_SetErrorC
fcb0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
fcc0: 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 45  ", "STATUS", "CE
fcd0: 52 54 49 46 49 43 41 54 45 22 2c 20 28 63 68 61  RTIFICATE", (cha
fce0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  r *) NULL);..Tcl
fcf0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _IncrRefCount(ob
fd00: 6a 50 74 72 29 3b 0a 09 54 63 6c 5f 44 65 63 72  jPtr);..Tcl_Decr
fd10: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29  RefCount(objPtr)
fd20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
fd30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
fd40: 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a  /* Peer name */.
fd50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fd60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fd70: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fd80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
fd90: 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a  eername", -1));.
fda0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fdb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fdc0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fdd0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
fde0: 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28  L_get0_peername(
fdf0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
fe00: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  -1));..    Tcl_L
fe10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
fe20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
fe30: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
fe40: 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31  gObj("sbits", -1
fe50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
fe60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fe70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fe80: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
fe90: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
fea0: 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
feb0: 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20  , NULL)));..    
fec0: 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a  ciphers = (char*
fed0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28  )SSL_get_cipher(
fee0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
fef0: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
ff00: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74   != NULL) && (st
ff10: 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28  rcmp(ciphers, "(
ff20: 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b  NONE)") != 0)) {
ff30: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
ff40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ff50: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
ff60: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
ff70: 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
ff80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ff90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ffa0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ffb0: 69 6e 67 4f 62 6a 28 63 69 70 68 65 72 73 2c 20  ingObj(ciphers, 
ffc0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  -1));.    }..   
ffd0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58   /* Verify the X
ffe0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
fff0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65  presented by the
10000 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c   peer */.    Tcl
10010 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10020 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10030 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10040 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 52 65  ingObj("verifyRe
10050 73 75 6c 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20  sult", -1));.   
10060 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10070 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10080 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e  , objPtr,..Tcl_N
10090 65 77 53 74 72 69 6e 67 4f 62 6a 28 58 35 30 39  ewStringObj(X509
100a0 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
100b0 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
100c0 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
100d0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c  statePtr->ssl)),
100e0 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56   -1));..    /* V
100f0 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20  erify mode */.  
10100 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10110 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10120 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10130 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72  ewStringObj("ver
10140 69 66 79 4d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a  ifyMode", -1));.
10150 20 20 20 20 2f 2a 20 53 53 4c 5f 43 54 58 5f 67      /* SSL_CTX_g
10160 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 63  et_verify_mode(c
10170 74 78 29 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20  tx) */.    mode 
10180 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  = SSL_get_verify
10190 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
101a0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f  ssl);.    if (mo
101b0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
101c0 5f 4e 4f 4e 45 29 20 7b 0a 09 54 63 6c 5f 4c 69  _NONE) {..Tcl_Li
101d0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
101e0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
101f0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10200 4f 62 6a 28 22 6e 6f 6e 65 22 2c 20 2d 31 29 29  Obj("none", -1))
10210 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10220 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a  Tcl_Obj *listObj
10230 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
10240 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
10250 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10260 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09  VERIFY_PEER) {..
10270 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10280 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10290 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
102a0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
102b0 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a  j("peer", -1));.
102c0 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
102d0 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
102e0 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29  IF_NO_PEER_CERT)
102f0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
10300 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10310 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
10320 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10330 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e  ngObj("fail if n
10340 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31  o peer cert", -1
10350 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
10360 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   && SSL_VERIFY_C
10370 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20  LIENT_ONCE) {.. 
10380 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10390 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
103a0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
103b0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
103c0 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20  ("client once", 
103d0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
103e0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
103f0 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29  _POST_HANDSHAKE)
10400 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
10410 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10420 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
10430 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10440 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64  ngObj("post hand
10450 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d  shake", -1));..}
10460 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10470 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10480 70 2c 20 6f 62 6a 50 74 72 2c 20 6c 69 73 74 4f  p, objPtr, listO
10490 62 6a 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  bjPtr);.    }.. 
104a0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64     /* Verify mod
104b0 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 54  e depth */.    T
104c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
104d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
104e0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
104f0 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79  tringObj("verify
10500 44 65 70 74 68 22 2c 20 2d 31 29 29 3b 0a 20 20  Depth", -1));.  
10510 20 20 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74    /* SSL_CTX_get
10520 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 63 74  _verify_depth(ct
10530 78 29 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69  x) */.    Tcl_Li
10540 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10550 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10560 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
10570 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
10580 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e  depth(statePtr->
10590 73 73 6c 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ssl)));..    /* 
105a0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
105b0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
105c0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
105d0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20  negotiation */. 
105e0 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e     SSL_get0_alpn
105f0 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50  _selected(stateP
10600 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  tr->ssl, &proto,
10610 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f   &len);.    Tcl_
10620 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10630 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10640 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10650 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
10660 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
10670 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10680 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10690 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
106a0 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c  j((char *)proto,
106b0 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 20   (int) len));.  
106c0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
106d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
106e0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
106f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f  ewStringObj("pro
10700 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20  tocol", -1));.  
10710 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10720 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10730 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10740 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
10750 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74  get_version(stat
10760 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29  ePtr->ssl), -1))
10770 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
10780 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
10790 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
107a0 33 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  3 */.    Tcl_Lis
107b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
107c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
107d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
107e0 62 6a 28 22 73 69 67 6e 61 74 75 72 65 48 61 73  bj("signatureHas
107f0 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 2d 31 29  hAlgorithm", -1)
10800 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  );.    if (objc 
10810 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70  == 2 ? SSL_get_p
10820 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69  eer_signature_ni
10830 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10840 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74   &nid) : SSL_get
10850 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
10860 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
10870 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  id)) {..Tcl_List
10880 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10890 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
108a0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
108b0 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64  j(OBJ_nid2ln(nid
108c0 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65  ), -1));.    } e
108d0 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f  lse {..Tcl_ListO
108e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
108f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10900 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10910 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ("", -1));.    }
10920 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10930 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10940 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10950 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10960 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20  signatureType", 
10970 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62  -1));.    if (ob
10980 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65  jc == 2 ? SSL_ge
10990 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
109a0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
109b0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a  tr->ssl, &nid) :
109c0 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75   SSL_get_signatu
109d0 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
109e0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
109f0 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
10a00 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10a10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10a20 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f  l_NewStringObj(O
10a30 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
10a40 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  -1));.    } else
10a50 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
10a60 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10a70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10a80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
10a90 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  , -1));.    }.. 
10aa0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
10ab0 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
10ac0 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
10ad0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
10ae0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
10af0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10b40 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  *. * ConnectionI
10b50 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  nfoObjCmd -- ret
10b60 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  urn connection i
10b70 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  nfo from OpenSSL
10b80 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
10b90 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f  . *.A list of co
10ba0 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20  nnection info.  
10bb0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bf0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
10c00 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69  tic int Connecti
10c10 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69  onInfoObjCmd(Cli
10c20 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
10c30 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
10c40 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
10c50 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
10c60 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
10c70 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
10c80 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
10c90 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
10ca0 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
10cb0 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
10cc0 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
10cd0 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
10ce0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
10cf0 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
10d00 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b   const SSL *ssl;
10d10 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43  .    const SSL_C
10d20 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20  IPHER *cipher;. 
10d30 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53     const SSL_SES
10d40 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20  SION *session;. 
10d50 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20     long mode;.. 
10d60 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
10d70 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
10d80 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
10d90 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
10da0 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
10db0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
10dc0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10dd0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
10de0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10df0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
10e00 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
10e10 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
10e20 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
10e30 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  {..return(TCL_ER
10e40 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
10e50 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
10e60 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
10e70 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
10e80 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
10e90 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
10ea0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
10eb0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
10ec0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
10ed0 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
10ee0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
10ef0 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
10f00 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
10f10 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
10f20 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
10f30 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
10f40 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
10f50 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
10f60 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
10f70 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
10f80 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
10f90 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
10fa0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10fb0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f  R);.    }..    o
10fc0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
10fd0 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
10fe0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  ..    /* Connect
10ff0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
11000 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
11010 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
11020 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
11030 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20  han);.    ssl = 
11040 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20  statePtr->ssl;. 
11050 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
11060 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63  LL) {../* connec
11070 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54  tion state */..T
11080 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11090 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
110a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
110b0 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22  tringObj("state"
110c0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
110d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
110e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
110f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11100 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  bj(SSL_state_str
11110 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
11120 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e  1));.../* Get SN
11130 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76  I requested serv
11140 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f  er name */..Tcl_
11150 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11160 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11170 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11180 6e 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d  ngObj("servernam
11190 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
111a0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
111b0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
111c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
111d0 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72  gObj(SSL_get_ser
111e0 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
111f0 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
11200 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a  t_name), -1));..
11210 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c  ./* Get protocol
11220 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
11230 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11240 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11250 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11260 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b  protocol", -1));
11270 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11280 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11290 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
112a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
112b0 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29  get_version(ssl)
112c0 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e  , -1));.../* Ren
112d0 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77  egotiation allow
112e0 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  ed */..Tcl_ListO
112f0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11300 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11310 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11320 28 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22  ("renegotiation"
11330 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11340 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11350 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11360 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11370 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74  bj(..    SSL_get
11380 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69  _secure_renegoti
11390 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73  ation_support(ss
113a0 6c 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22  l) ? "supported"
113b0 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65   : "not supporte
113c0 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47  d", -1));.../* G
113d0 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65  et security leve
113e0 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  l */..Tcl_ListOb
113f0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11400 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11410 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11420 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c  "securitylevel",
11430 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11440 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11450 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11460 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
11470 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
11480 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09  level(ssl)));...
11490 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
114a0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
114b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
114c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
114d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
114e0 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20  ession_reused", 
114f0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11500 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11510 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11520 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
11530 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  j(SSL_session_re
11540 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f  used(ssl)));.../
11550 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f  * Is server info
11560 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
11570 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11580 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11590 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
115a0 69 73 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29  is_server", -1))
115b0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
115c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
115d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
115e0 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53  NewBooleanObj(SS
115f0 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
11600 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
11610 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f  * Cipher info */
11620 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53  .    cipher = SS
11630 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69  L_get_current_ci
11640 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69  pher(ssl);.    i
11650 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c  f (cipher != NUL
11660 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42  L) {..char buf[B
11670 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69  UFSIZ] = {0};..i
11680 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74  nt bits, alg_bit
11690 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  s;...Tcl_ListObj
116a0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
116b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
116c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
116d0 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09  cipher", -1));..
116e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
116f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11700 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11710 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49  StringObj(SSL_CI
11720 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69  PHER_get_name(ci
11730 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63  pher), -1));..Tc
11740 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11750 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11760 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11770 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72  ringObj("standar
11780 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09  d_name", -1));..
11790 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
117a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
117b0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
117c0 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49  StringObj(SSL_CI
117d0 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
117e0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29  me(cipher), -1))
117f0 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43  ;...bits = SSL_C
11800 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63  IPHER_get_bits(c
11810 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73  ipher, &alg_bits
11820 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11830 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11840 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11850 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
11860 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 29  ecret_bits", -1)
11870 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11880 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11890 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
118a0 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 29  _NewIntObj(bits)
118b0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
118c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
118d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
118e0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61  _NewStringObj("a
118f0 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20  lgorithm_bits", 
11900 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11910 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11920 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11930 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c  Tcl_NewIntObj(al
11940 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c  g_bits));../* al
11950 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c  g_bits is actual
11960 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73   key secret bits
11970 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e  . If use bits an
11980 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69  d secret (algori
11990 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72  thm) bits differ
119a0 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f  ,..   the rest o
119b0 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66  f the bits are f
119c0 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c  ixed, i.e. for l
119d0 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69  imited export ci
119e0 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36  phers (bits < 56
119f0 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ) */..Tcl_ListOb
11a00 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11a10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11a20 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11a30 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d  "min_version", -
11a40 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11a50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11a60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11a70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11a80 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76  SSL_CIPHER_get_v
11a90 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20  ersion(cipher), 
11aa0 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f  -1));.../* Get O
11ab0 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20  penSSL-specific 
11ac0 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20  ID, not IANA ID 
11ad0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11ae0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11af0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11b00 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69  _NewStringObj("i
11b10 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  d", -1));..Tcl_L
11b20 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11b30 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11b40 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
11b50 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48  j((int) SSL_CIPH
11b60 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72  ER_get_id(cipher
11b70 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  )));...if (SSL_C
11b80 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
11b90 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73  n(cipher, buf, s
11ba0 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
11bb0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
11bc0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11bd0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11be0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11bf0 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69  ngObj("descripti
11c00 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  on", -1));..    
11c10 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11c20 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11c30 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11c40 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d  StringObj(buf, -
11c50 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  1));..}.    }.. 
11c60 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e     /* Session in
11c70 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  fo */.    sessio
11c80 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73  n = SSL_get_sess
11c90 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  ion(ssl);.    if
11ca0 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c   (session != NUL
11cb0 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
11cc0 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
11cd0 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b  t;..size_t len2;
11ce0 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  ..unsigned int u
11cf0 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len;..const unsi
11d00 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
11d10 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09  on_id, *proto;..
11d20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f  char buffer[SSL_
11d30 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
11d40 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70  ENGTH];.../* Rep
11d50 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
11d60 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
11d70 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50  esult of the ALP
11d80 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
11d90 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
11da0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
11db0 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f  (session, &proto
11dc0 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c  , &len2);..Tcl_L
11dd0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11de0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11df0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11e00 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
11e10 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11e20 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11e30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11e40 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
11e50 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e  har *)proto, (in
11e60 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20  t) len2));.../* 
11e70 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
11e80 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
11e90 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
11ea0 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
11eb0 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
11ec0 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
11ed0 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
11ee0 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
11ef0 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  ulen);..Tcl_List
11f00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11f10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11f20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11f30 6a 28 22 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09  j("npn", -1));..
11f40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11f50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11f60 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11f70 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20  StringObj((char 
11f80 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75  *)proto, (int) u
11f90 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  len));.#endif...
11fa0 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73  /* Resumable ses
11fb0 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  sion */..Tcl_Lis
11fc0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11fd0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11fe0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11ff0 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  bj("resumable", 
12000 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
12010 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12020 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12030 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53  Tcl_NewIntObj(SS
12040 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73  L_SESSION_is_res
12050 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29  umable(session))
12060 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12070 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f  start time (seco
12080 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29  nds since epoch)
12090 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
120a0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
120b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
120c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
120d0 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29  start_time", -1)
120e0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
120f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12100 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12110 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f  _NewLongObj(SSL_
12120 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
12130 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
12140 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  * Timeout value 
12150 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69  - SSL_CTX_get_ti
12160 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64  meout (in second
12170 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  s) */..Tcl_ListO
12180 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12190 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
121a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
121b0 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29  ("timeout", -1))
121c0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
121d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
121e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
121f0 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53  NewLongObj(SSL_S
12200 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
12210 75 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  ut(session)));..
12220 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
12230 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74  et lifetime hint
12240 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f   (in seconds) */
12250 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12260 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12270 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12280 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66  ewStringObj("lif
12290 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54  etime", -1));..T
122a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
122b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
122c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c  objPtr, Tcl_NewL
122d0 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49  ongObj(SSL_SESSI
122e0 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
122f0 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
12300 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  ion)));.../* Ses
12310 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e  sion id - TLSv1.
12320 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79  2 and below only
12330 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20   */..session_id 
12340 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
12350 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75  t_id(session, &u
12360 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  len);..Tcl_ListO
12370 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12380 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12390 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
123a0 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d  ("session_id", -
123b0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
123c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
123d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
123e0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
123f0 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  bj(session_id, (
12400 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f  int) ulen));.../
12410 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78  * Session contex
12420 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  t */..session_id
12430 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12440 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73  et0_id_context(s
12450 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
12460 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12470 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12480 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12490 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73  wStringObj("sess
124a0 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 2d 31  ion_context", -1
124b0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
124c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
124d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
124e0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
124f0 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69  j(session_id, (i
12500 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a  nt) ulen));.../*
12510 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
12520 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f  - client only */
12530 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
12540 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f  t0_ticket(sessio
12550 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
12560 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  2);..Tcl_ListObj
12570 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12580 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12590 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
125a0 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c  session_ticket",
125b0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
125c0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
125d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
125e0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
125f0 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e  yObj(ticket, (in
12600 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20  t) len2));.../* 
12610 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20  Ticket app data 
12620 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
12630 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64  get0_ticket_appd
12640 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ata(session, &ti
12650 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54  cket, &len2);..T
12660 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12670 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12680 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12690 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74  tringObj("ticket
126a0 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29  _app_data", -1))
126b0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
126c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
126d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
126e0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
126f0 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65  ticket, (int) le
12700 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d  n2));.../* Get m
12710 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65  aster key */..le
12720 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  n2 = SSL_SESSION
12730 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28  _get_master_key(
12740 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c  session, buffer,
12750 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f   SSL_MAX_MASTER_
12760 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63  KEY_LENGTH);..Tc
12770 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12780 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12790 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
127a0 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f  ringObj("master_
127b0 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  key", -1));..Tcl
127c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
127d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
127e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  jPtr, Tcl_NewByt
127f0 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72  eArrayObj(buffer
12800 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a  , (int) len2));.
12810 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
12820 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  mpression info *
12830 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  /.    if (ssl !=
12840 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20   NULL) {.#ifdef 
12850 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53  HAVE_SSL_COMPRES
12860 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50  SION..const COMP
12870 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a  _METHOD *comp, *
12880 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53  expn;..comp = SS
12890 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f  L_get_current_co
128a0 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a  mpression(ssl);.
128b0 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f  .expn = SSL_get_
128c0 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f  current_expansio
128d0 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69  n(ssl);...Tcl_Li
128e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
128f0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12900 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12910 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e  Obj("compression
12920 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12930 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12940 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12950 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12960 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43  Obj(comp ? SSL_C
12970 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d  OMP_get_name(com
12980 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29  p) : "NONE", -1)
12990 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
129a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
129b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
129c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
129d0 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  xpansion", -1));
129e0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
129f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12a00 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12a10 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e  ewStringObj(expn
12a20 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
12a30 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f  name(expn) : "NO
12a40 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65  NE", -1));.#else
12a50 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12a60 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12a70 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12a80 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d  ewStringObj("com
12a90 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  pression", -1));
12aa0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12ab0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12ac0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12ad0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e  ewStringObj("NON
12ae0 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  E", -1));..Tcl_L
12af0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12b00 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12b10 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12b20 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22  gObj("expansion"
12b30 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
12b40 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12b50 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
12b60 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12b70 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b  bj("NONE", -1));
12b80 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
12b90 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66     /* Server inf
12ba0 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6d 6f 64 65  o */.    {..mode
12bb0 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73   = SSL_CTX_get_s
12bc0 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
12bd0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
12be0 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 09 0a  ;..char *msg;...
12bf0 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
12c00 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20  SESS_CACHE_OFF) 
12c10 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66  {..    msg = "of
12c20 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  f";..} else if (
12c30 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
12c40 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
12c50 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65  .    msg = "clie
12c60 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  nt";..} else if 
12c70 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12c80 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b  _CACHE_SERVER) {
12c90 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72  ..    msg = "ser
12ca0 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
12cb0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
12cc0 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a  S_CACHE_BOTH) {.
12cd0 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68  .    msg = "both
12ce0 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ";..} else {..  
12cf0 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e    msg = "unknown
12d00 22 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  ";..}..Tcl_ListO
12d10 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12d20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12d30 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12d40 28 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f  ("session_cache_
12d50 6d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  mode", -1));..Tc
12d60 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12d70 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12d80 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
12d90 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
12da0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12db0 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20   CA List */.    
12dc0 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76  /* IF not a serv
12dd0 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  er, same as SSL_
12de0 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73  get0_peer_CA_lis
12df0 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d  t. If server sam
12e00 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74  e as SSL_CTX_get
12e10 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20  _client_CA_list 
12e20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d  */.    listPtr =
12e30 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
12e40 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54  0, NULL);.    ST
12e50 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
12e60 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20  ) *ca_list;.    
12e70 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53  if ((ca_list = S
12e80 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  SL_get_client_CA
12e90 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e  _list(ssl)) != N
12ea0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
12eb0 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f  fer[BUFSIZ];..fo
12ec0 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
12ed0 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e  < sk_X509_NAME_n
12ee0 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b  um(ca_list); i++
12ef0 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  ) {..    X509_NA
12f00 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35  ME *name = sk_X5
12f10 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61  09_NAME_value(ca
12f20 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20  _list, i);..    
12f30 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35  if (name) {...X5
12f40 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28  09_NAME_oneline(
12f50 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55  name, buffer, BU
12f60 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73  FSIZ);...Tcl_Lis
12f70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12f80 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
12f90 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12fa0 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29  Obj(buffer, -1))
12fb0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
12fc0 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
12fd0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12fe0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12ff0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13000 22 63 61 4c 69 73 74 22 2c 20 2d 31 29 29 3b 0a  "caList", -1));.
13010 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
13020 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13030 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 6c 69 73  erp, objPtr, lis
13040 74 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  tPtr);..    Tcl_
13050 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13060 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
13070 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13080 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
13090 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
130a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130e0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
130f0 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72  rsionObjCmd -- r
13100 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74  eturn version st
13110 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53  ring from OpenSS
13120 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
13130 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
13140 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
13150 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
13160 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131b0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
131c0 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43  .VersionObjCmd(C
131d0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
131e0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
131f0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
13200 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
13210 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
13220 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
13230 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
13240 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f  Called");..    o
13250 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
13260 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c  tringObj(OPENSSL
13270 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d  _VERSION_TEXT, -
13280 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  1);.    Tcl_SetO
13290 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
132a0 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72   objPtr);..    r
132b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
132c0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
132d0 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20  ntData;..objc = 
132e0 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62  objc;..objv = ob
132f0 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  jv;.}.../*. *---
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d  . *. * MiscObjCm
13350 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e  d -- misc comman
13360 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ds. *. * Results
13370 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
13380 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
13390 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
133a0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133f0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
13400 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65  .MiscObjCmd(Clie
13410 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
13420 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
13430 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
13440 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
13450 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74  objv[]) {.    st
13460 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13470 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b  *commands [] = {
13480 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22   "req", "strreq"
13490 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e  , NULL };.    en
134a0 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52  um command { C_R
134b0 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f  EQ, C_STRREQ, C_
134c0 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74  DUMMY };.    int
134d0 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20   cmd, isStr;.   
134e0 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
134f0 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  84];..    dprint
13500 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
13510 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
13520 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
13530 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
13540 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64  bjv, "subcommand
13550 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75   ?args?");..retu
13560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13570 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
13580 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
13590 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
135a0 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d   commands, "comm
135b0 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d  and", 0,&cmd) !=
135c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
135d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
135e0 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
135f0 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
13600 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d   isStr = (cmd ==
13610 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20   C_STRREQ);.    
13620 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f  switch ((enum co
13630 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63  mmand) cmd) {..c
13640 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65  ase C_REQ:..case
13650 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20   C_STRREQ: {..  
13660 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79    EVP_PKEY *pkey
13670 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
13680 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20   *cert=NULL;..  
13690 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d    X509_NAME *nam
136a0 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c  e=NULL;..    Tcl
136b0 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20  _Obj **listv;.. 
136c0 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a     int listc,i;.
136d0 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e  ..    BIO *out=N
136e0 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20  ULL;...    char 
136f0 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22  *k_C="",*k_ST=""
13700 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22  ,*k_L="",*k_O=""
13710 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d  ,*k_OU="",*k_CN=
13720 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a  "",*k_Email="";.
13730 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75  .    char *keyou
13740 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a  t,*pemout,*str;.
13750 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65  .    int keysize
13760 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33  ,serial=0,days=3
13770 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  65;..#if OPENSSL
13780 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
13790 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
137a0 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d     BIGNUM *bne =
137b0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20   NULL;..    RSA 
137c0 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c  *rsa = NULL;.#el
137d0 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59  se..    EVP_PKEY
137e0 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
137f0 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69  ;.#endif...    i
13800 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28  f ((objc<5) || (
13810 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c  objc>6)) {...Tcl
13820 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13830 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13840 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20  keysize keyfile 
13850 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22  certfile ?info?"
13860 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
13870 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09  ERROR;..    }...
13880 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
13890 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
138a0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73  , objv[2], &keys
138b0 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ize) != TCL_OK) 
138c0 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  {...return TCL_E
138d0 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
138e0 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74    keyout=Tcl_Get
138f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
13900 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c  ..    pemout=Tcl
13910 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13920 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73  4]);..    if (is
13930 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  Str) {...Tcl_Set
13940 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
13950 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53  t,"",0);...Tcl_S
13960 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
13970 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20  out,"",0);..    
13980 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63  }...    if (objc
13990 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c  >=6) {...if (Tcl
139a0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
139b0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  nts(interp, objv
139c0 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20  [5],....&listc, 
139d0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
139e0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
139f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13a00 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
13a10 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
13a20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
13a30 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
13a40 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
13a50 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
13a60 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
13a70 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
13a80 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
13a90 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
13aa0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
13ab0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
13ac0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
13ad0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
13ae0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
13af0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
13b00 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13b10 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
13b20 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
13b30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13b40 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
13b50 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13b60 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
13b70 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
13b80 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13b90 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
13ba0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
13bb0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13bc0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
13bd0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13be0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
13bf0 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
13c00 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13c10 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13c20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
13c30 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
13c40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13c50 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13c60 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13c70 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
13c80 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
13c90 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13ca0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13cb0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13cc0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
13cd0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
13ce0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13cf0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13d00 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
13d10 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
13d20 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
13d30 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13d40 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13d50 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
13d60 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
13d70 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13d80 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13d90 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13da0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
13db0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
13dc0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13dd0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13de0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
13df0 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
13e00 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
13e10 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
13e20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
13e30 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
13e40 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
13e50 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
13e60 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
13e70 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
13e80 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
13e90 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
13ea0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
13eb0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
13ec0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
13ed0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
13ee0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
13ef0 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
13f00 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
13f10 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
13f20 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
13f30 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
13f40 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
13f50 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
13f60 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
13f70 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
13f80 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
13f90 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
13fa0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
13fb0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
13fc0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
13fd0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
13fe0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
13ff0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
14000 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
14010 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
14020 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
14030 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
14040 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
14050 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
14060 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
14070 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
14080 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
14090 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
140a0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
140b0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
140c0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
140d0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
140e0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
140f0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
14100 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
14110 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
14120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14130 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
14140 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
14150 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
14160 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
14170 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
14180 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
14190 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
141a0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
141b0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
141c0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
141d0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
141e0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
141f0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
14200 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
14210 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
14220 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
14230 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
14240 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
14250 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
14260 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
14270 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
14280 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
14290 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
142a0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
142b0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
142c0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
142d0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
142e0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
142f0 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
14300 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
14310 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
14320 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
14330 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
14340 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
14350 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
14360 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
14370 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
14380 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
14390 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
143a0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
143b0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
143c0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
143d0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
143e0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
143f0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
14400 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
14410 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
14420 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
14430 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
14440 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76  .}....X509_set_v
14450 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a  ersion(cert,2);.
14460 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73  ..ASN1_INTEGER_s
14470 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69  et(X509_get_seri
14480 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73  alNumber(cert),s
14490 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67  erial);...X509_g
144a0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
144b0 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65  etm_notBefore(ce
144c0 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67  rt),0);...X509_g
144d0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
144e0 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72  etm_notAfter(cer
144f0 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32  t),(long)60*60*2
14500 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f  4*days);...X509_
14510 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c  set_pubkey(cert,
14520 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58  pkey);....name=X
14530 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f  509_get_subject_
14540 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58  name(cert);....X
14550 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14560 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14570 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  C", MBSTRING_ASC
14580 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14590 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d  d char *) k_C, -
145a0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
145b0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
145c0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54  _by_txt(name,"ST
145d0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
145e0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
145f0 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d   char *) k_ST, -
14600 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14610 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14620 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22  _by_txt(name,"L"
14630 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14640 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14650 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c  char *) k_L, -1,
14660 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14670 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14680 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20  y_txt(name,"O", 
14690 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
146a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
146b0 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d  ar *) k_O, -1, -
146c0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
146d0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
146e0 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d  txt(name,"OU", M
146f0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
14700 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14710 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d  r *) k_OU, -1, -
14720 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
14730 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
14740 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d  txt(name,"CN", M
14750 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
14760 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14770 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d  r *) k_CN, -1, -
14780 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
14790 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
147a0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22  txt(name,"Email"
147b0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
147c0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
147d0 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c  char *) k_Email,
147e0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09   -1, -1, 0);....
147f0 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74  X509_set_subject
14800 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29  _name(cert,name)
14810 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73  ;....if (!X509_s
14820 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56  ign(cert,pkey,EV
14830 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09  P_sha256())) {..
14840 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63  .    X509_free(c
14850 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f  ert);...    EVP_
14860 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
14870 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
14880 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
14890 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20  30000000L...    
148a0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
148b0 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53  ndif...    Tcl_S
148c0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
148d0 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63  "Error signing c
148e0 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c  ertificate",NULL
148f0 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
14900 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
14910 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
14920 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
14930 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
14940 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
14950 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
14960 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
14970 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
14980 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
14990 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
149a0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
149b0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
149c0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
149d0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75  interp,pemout,bu
149e0 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
149f0 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
14a00 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
14a10 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
14a20 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
14a30 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
14a40 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
14a50 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d  filename(out,pem
14a60 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
14a70 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
14a80 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
14a90 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
14aa0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66  );...}....X509_f
14ab0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50  ree(cert);...EVP
14ac0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
14ad0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
14ae0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
14af0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f  x30000000L...BN_
14b00 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
14b10 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65  f..    }..}..bre
14b20 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
14b30 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ..break;.    }. 
14b40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
14b50 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
14b60 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
14b70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14b80 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20  *****/./* Init  
14b90 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a             */./*
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bb0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14c00 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
14c10 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
14c20 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
14c30 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
14c40 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
14c50 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
14c60 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
14c70 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
14c80 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
14c90 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
14ca0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14cb0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
14cc0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14d10 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
14d20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20  char *blockPtr) 
14d30 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
14d40 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
14d50 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20  )blockPtr;..    
14d60 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
14d70 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61  );..    Tls_Clea
14d80 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
14d90 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72   ckfree(blockPtr
14da0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14df0 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20   *. * Tls_Clean 
14e00 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
14e10 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
14e20 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
14e30 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
14e40 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
14e50 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
14e60 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
14e70 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75  ow 1.  This shou
14e80 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20  ld. *.be called 
14e90 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79  synchronously by
14ea0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20   the CloseProc, 
14eb0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76  not in the. *.Ev
14ec0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c  entuallyFree cal
14ed0 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
14ee0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
14ef0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
14f00 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
14f10 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f30 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43  -. */.void Tls_C
14f70 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74  lean(State *stat
14f80 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69  ePtr) {.    dpri
14f90 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
14fa0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65      /*.     * we
14fb0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72  're assuming her
14fc0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e  e that we're sin
14fd0 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20  gle-threaded.   
14fe0 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61    */.    if (sta
14ff0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
15000 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
15010 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
15020 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
15030 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
15040 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
15050 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  mer = NULL;.    
15060 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
15070 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09  Ptr->protos) {..
15080 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  ckfree(statePtr-
15090 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65  >protos);..state
150a0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
150b0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
150c0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
150d0 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
150e0 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
150f0 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
15100 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
15110 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
15120 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
15130 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
15140 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
15150 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
15160 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15170 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
15180 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53  ) {..dprintf("SS
15190 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61  L_free(%p)", sta
151a0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53  tePtr->ssl);..SS
151b0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  L_free(statePtr-
151c0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72  >ssl);..statePtr
151d0 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ssl = NULL;.  
151e0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
151f0 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53  ePtr->ctx) {..SS
15200 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  L_CTX_free(state
15210 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74  Ptr->ctx);..stat
15220 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
15230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
15240 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
15250 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
15260 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
15270 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
15280 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
15290 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
152a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
152b0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
152c0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
152d0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
152e0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
152f0 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
15300 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15310 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a  atePtr->vcmd) {.
15320 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
15330 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
15340 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63  );..statePtr->vc
15350 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  md = NULL;.    }
15360 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
15370 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a  eturning");.}...
15380 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
153d0 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  ls_Init --. *. *
153e0 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61  .This is a packa
153f0 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ge initializatio
15400 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69  n procedure, whi
15410 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  ch is called. *.
15420 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73  by Tcl when this
15430 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62   package is to b
15440 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e  e added to an in
15450 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a  terpreter.. *. *
15460 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63   Results:  Ssl c
15470 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f  onfigured and lo
15480 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  aded. *. * Side 
15490 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65  effects:. *. cre
154a0 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d  ate the ssl comm
154b0 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20  and, initialize 
154c0 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20  ssl context. *. 
154d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15510 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f  ----. */.DLLEXPO
15520 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28  RT int Tls_Init(
15530 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15540 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  rp) {.    const 
15550 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53  char tlsTclInitS
15560 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63  cript[] = {.#inc
15570 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22  lude "tls.tcl.h"
15580 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20  ..0x00.    };.. 
15590 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
155a0 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ed");..    /*.  
155b0 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70     * We only sup
155c0 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20  port Tcl 8.4 or 
155d0 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20  newer.     */.  
155e0 20 20 69 66 20 28 0a 23 69 66 64 65 66 20 55 53    if (.#ifdef US
155f0 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c  E_TCL_STUBS..Tcl
15600 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
15610 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c  p, "8.4", 0).#el
15620 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69  se..Tcl_PkgRequi
15630 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22  re(interp, "Tcl"
15640 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e  , "8.4-", 0).#en
15650 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dif.. == NULL) {
15660 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
15670 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
15680 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29  f (TlsLibInit(0)
15690 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   != TCL_OK) {..T
156a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
156b0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e  interp, "could n
156c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53  ot initialize SS
156d0 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c  L library", NULL
156e0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
156f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
15700 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15710 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15720 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69  ls::ciphers", Ci
15730 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  phersObjCmd, (Cl
15740 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15750 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15760 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15770 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15780 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15790 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f  :connection", Co
157a0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
157b0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
157c0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
157d0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
157e0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
157f0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15800 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b  , "tls::handshak
15810 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  e", HandshakeObj
15820 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15830 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
15840 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15850 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15860 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15870 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22  p, "tls::import"
15880 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  , ImportObjCmd, 
15890 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
158a0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
158b0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
158c0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
158d0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
158e0 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55  ls::unimport", U
158f0 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28  nimportObjCmd, (
15900 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
15910 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15920 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15930 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15940 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15950 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74  s::status", Stat
15960 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  usObjCmd, (Clien
15970 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
15980 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
15990 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
159a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
159b0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65  interp, "tls::ve
159c0 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f  rsion", VersionO
159d0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
159e0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
159f0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15a00 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15a10 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15a20 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22  erp, "tls::misc"
15a30 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43  , MiscObjCmd, (C
15a40 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
15a50 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15a60 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15a70 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15a80 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15a90 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72  ::protocols", Pr
15aa0 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28  otocolsObjCmd, (
15ab0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
15ac0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15ad0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  c *) NULL);..   
15ae0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09   if (interp) {..
15af0 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
15b00 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
15b10 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  t);.    }..    r
15b20 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f  eturn(Tcl_PkgPro
15b30 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c  vide(interp, "tl
15b40 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  s", PACKAGE_VERS
15b50 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ION));.}../*. *-
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b90 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
15ba0 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a  _SafeInit --. *.
15bb0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15be0 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64  ---*. *.Standard
15bf0 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69   procedure requi
15c00 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20  red by 'load'.. 
15c10 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  *.Initializes th
15c20 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72  is extension for
15c30 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65   a safe interpre
15c40 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  ter.. *.--------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
15c80 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
15c90 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69  ..As of 'Tls_Ini
15ca0 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  t'. *. *.Result:
15cb0 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20  . *..A standard 
15cc0 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  Tcl error code..
15cd0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f  -----------*. */
15d10 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54  .DLLEXPORT int T
15d20 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  ls_SafeInit(Tcl_
15d30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
15d40 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  {.    dprintf("C
15d50 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  alled");.    ret
15d60 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74  urn(Tls_Init(int
15d70 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  erp));.}../*. *-
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15db0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
15dc0 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  LibInit --. *. *
15dd0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e00 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  -*. *.Initialize
15e10 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e  s SSL library on
15e20 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69  ce per applicati
15e30 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  on. *.----------
15e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e60 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
15e70 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
15e80 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  initializes SSL 
15e90 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65  library. *. *.Re
15ea0 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20  sult:. *..none. 
15eb0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
15ef0 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
15f00 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
15f10 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74  ialize) {.    st
15f20 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c  atic int initial
15f30 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ized = 0;.    in
15f40 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f  t status = TCL_O
15f50 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  K;.#if defined(O
15f60 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15f70 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15f80 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65  HREADS).    size
15f90 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65  _t num_locks;.#e
15fa0 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e  ndif..    if (un
15fb0 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69  initialize) {..i
15fc0 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
15fd0 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
15fe0 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
15ff0 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61  ialize, but we a
16000 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
16010 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75  ed");...    retu
16020 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(TCL_OK);..}..
16030 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20  .dprintf("Asked 
16040 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22  to uninitialize"
16050 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
16060 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
16070 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
16080 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
16090 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
160a0 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20  );...if (locks) 
160b0 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b  {..    free(lock
160c0 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d  s);..    locks =
160d0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b   NULL;..    lock
160e0 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23  sCount = 0;..}.#
160f0 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a  endif..initializ
16100 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66  ed = 0;..#if def
16110 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16120 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16130 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
16140 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
16150 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
16160 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b  ...return(TCL_OK
16170 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
16180 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b   (initialized) {
16190 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65  ..dprintf("Calle
161a0 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63  d, but using cac
161b0 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65  hed value");..re
161c0 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20  turn(status);.  
161d0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
161e0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
161f0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16200 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16210 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16220 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c  ).    Tcl_MutexL
16230 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
16240 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61  endif.    initia
16250 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20  lized = 1;..#if 
16260 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
16270 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
16280 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
16290 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d  .    num_locks =
162a0 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75   1;.    locksCou
162b0 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c  nt = (int) num_l
162c0 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20  ocks;.    locks 
162d0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
162e0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f  *locks) * num_lo
162f0 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  cks);.    memset
16300 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f  (locks, 0, sizeo
16310 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f  f(*locks) * num_
16320 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a  locks);.#endif..
16330 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
16340 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f  e BOTH libcrypto
16350 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a   and libssl. */.
16360 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74      OPENSSL_init
16370 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49  _ssl(OPENSSL_INI
16380 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e  T_LOAD_SSL_STRIN
16390 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  GS | OPENSSL_INI
163a0 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54  T_LOAD_CRYPTO_ST
163b0 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c  RINGS..| OPENSSL
163c0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49  _INIT_ADD_ALL_CI
163d0 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  PHERS | OPENSSL_
163e0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47  INIT_ADD_ALL_DIG
163f0 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  ESTS, NULL);..  
16400 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55    BIO_new_tcl(NU
16410 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20  LL, 0);..#if 0. 
16420 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58     /*.     * XXX
16430 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68  :TODO: Remove th
16440 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c  is code and repl
16450 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68  ace it with a ch
16460 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65  eck.     * for e
16470 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e  nough entropy an
16480 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  d do not try to 
16490 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20  create our own. 
164a0 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65      * terrible e
164b0 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20  ntropy.     */. 
164c0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65     /*.     * See
164d0 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d  d the random num
164e0 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ber generator in
164f0 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79   the SSL library
16500 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74  ,.     * using t
16510 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73  he do/while cons
16520 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66  truct because of
16530 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e   the bug note in
16540 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e   the.     * Open
16550 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a  SSL FAQ at http:
16560 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72  //www.openssl.or
16570 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74  g/support/faq.ht
16580 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a  ml#USER1.     *.
16590 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20       * The crux 
165a0 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69  of the problem i
165b0 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37  s that Solaris 7
165c0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
165d0 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e  .     * /dev/ran
165e0 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e  dom or /dev/uran
165f0 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74  dom device so it
16600 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65   cannot gather e
16610 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74  nough.     * ent
16620 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41  ropy from the RA
16630 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54  ND_seed() when T
16640 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61  LS initializes a
16650 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20  nd refuses.     
16660 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
16670 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
16680 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72  s of OpenSSL car
16690 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65  ried on regardle
166a0 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss..     */.    
166b0 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20  srand((unsigned 
166c0 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f  int) time((time_
166d0 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20  t *) NULL));.   
166e0 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20   do {..for (i = 
166f0 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20  0; i < 16; i++) 
16700 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b  {..    rnd_seed[
16710 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20  i] = 1 + (char) 
16720 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f  (255.0 * rand()/
16730 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b  (RAND_MAX+1.0));
16740 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72  ..}..RAND_seed(r
16750 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28  nd_seed, sizeof(
16760 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20  rnd_seed));.    
16770 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74  } while (RAND_st
16780 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65  atus() != 1);.#e
16790 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
167a0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
167b0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
167c0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
167d0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
167e0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
167f0 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a  return(status);.
16800 7d 0a                                            }.