Hex Artifact Content

Artifact 6f8aac6c9a6934e868fa8c9923759d165effa965dec83514e55163c9f0b522f5:


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 2f 2a 2a 2a 2a 2a 2a 2a  ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20  * Callbacks     
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 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 49  --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53  *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63  void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74   ret) {.    Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61  tr;.    char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72  jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  ;..    cmdPtr = 
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  ack);..#if 0.   
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65  _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79  v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70  et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d  (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65  0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73  rror */..    Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20   SSL_ERROR(ssl, 
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  0));..    return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ;..}.    }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  f.    if (where 
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
0f60: 20 2f 2a 20 69 6e 66 6f 20 63 68 61 6e 6e 65 6c   /* info channel
0f70: 20 6d 61 6a 6f 72 20 6d 69 6e 6f 72 20 6d 65 73   major minor mes
0f80: 73 61 67 65 20 74 79 70 65 20 2a 2f 0a 20 20 20  sage type */.   
0f90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
0fa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
0fb0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
0fc0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f  wStringObj("info
0fd0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
0fe0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0ff0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1000: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1010: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
1020: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
1030: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
1040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1080: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b  Obj(major, -1));
1090: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
10c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
10d0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  inor, -1));..   
10e0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
10f0: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63  _CB_ALERT) {..Tc
1100: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1110: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1120: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
1130: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
1140: 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69  _alert_desc_stri
1150: 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31  ng_long(ret), -1
1160: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
1170: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1180: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1190: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
11a0: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79  Obj(SSL_alert_ty
11b0: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  pe_string_long(r
11c0: 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  et), -1));.    }
11d0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73   else {..Tcl_Lis
11e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1200: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1210: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74  ringObj(SSL_stat
1220: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
1230: 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  l), -1));..Tcl_L
1240: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1250: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1260: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1270: 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29  gObj("info", -1)
1280: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
1290: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
12a0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
12b0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
12c0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
12d0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  atePtr);..    Tc
12e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
12f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69  mdPtr);.    (voi
1300: 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  d) Tcl_EvalObjEx
1310: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1320: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
1330: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1340: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
1350: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
1360: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
1370: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63  tatePtr);.    Tc
1380: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
1390: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
13a0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
13f0: 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63   * VerifyCallbac
1400: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
1410: 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63  ors SSL certific
1420: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70  ate validation p
1430: 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 20  rocess.. *.This 
1440: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
1450: 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 65  er a certificate
1460: 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 2a   is inspected. *
1470: 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61  .or decided inva
1480: 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  lid.. *. * Resul
1490: 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63  ts:. *.A callbac
14a0: 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73  k bound to the s
14b0: 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e  ocket may return
14c0: 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20   one of:. *.    
14d0: 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  0...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
14f0: 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 31  invalid. *.    1
1500: 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69  ...- the certifi
1510: 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76  cate is deemed v
1520: 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 74  alid. *.    empt
1530: 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68  y string.- no ch
1540: 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63  ange to certific
1550: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20  ate validation. 
1560: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1570: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69  s:. *.The err fi
1580: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
1590: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53  ntly operative S
15a0: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20  tate is set. *. 
15b0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73   to a string des
15c0: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20  cribing the SSL 
15d0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c  negotiation fail
15e0: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d  ure reason. *---
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1630: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
1640: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69  VerifyCallback(i
1650: 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52  nt ok, X509_STOR
1660: 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20  E_CTX *ctx) {.  
1670: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1680: 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 20  r, *result;.    
1690: 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20  char *string;.  
16a0: 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20    int length;.  
16b0: 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20    SSL   *ssl..= 
16c0: 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45  (SSL*)X509_STORE
16d0: 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61  _CTX_get_ex_data
16e0: 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78  (ctx, SSL_get_ex
16f0: 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45  _data_X509_STORE
1700: 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20  _CTX_idx());.   
1710: 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20   X509  *cert..= 
1720: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
1730: 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28  et_current_cert(
1740: 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20  ctx);.    State 
1750: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
1760: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
1770: 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54  data(ssl);.    T
1780: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1790: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
17a0: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65  terp;.    int de
17b0: 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  pth..= X509_STOR
17c0: 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f  E_CTX_get_error_
17d0: 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20  depth(ctx);.    
17e0: 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f  int err..= X509_
17f0: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72  STORE_CTX_get_er
1800: 72 6f 72 28 63 74 78 29 3b 0a 20 20 20 20 69 6e  ror(ctx);.    in
1810: 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72  t code;..    dpr
1820: 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 64  intf("Verify: %d
1830: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20  ", ok);..    if 
1840: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1850: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1860: 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74  )NULL) {..if (st
1870: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
1880: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
1890: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
18a0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
18b0: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
18c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
18d0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74      }..    cmdPt
18e0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
18f0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
1900: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
1910: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1920: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1930: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1940: 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22  ringObj("verify"
1950: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1960: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1970: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1980: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72  Ptr,..Tcl_NewStr
1990: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
19a0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
19b0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
19c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
19d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
19e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
19f0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74  l_NewIntObj(dept
1a00: 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  h));.    Tcl_Lis
1a10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1a20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1a30: 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  , Tls_NewX509Obj
1a40: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
1a50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1a60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1a70: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1a80: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29  l_NewIntObj(ok))
1a90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1aa0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1ab0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1ac0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1ad0: 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72  ((char*)X509_ver
1ae0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
1af0: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
1b00: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
1b10: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
1b20: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
1b30: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
1b40: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
1b50: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
1b60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
1b70: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20  CL_CALLBACK;..  
1b80: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1b90: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
1ba0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
1bb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
1bc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
1bd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
1be0: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode != TCL_OK) {
1bf0: 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20 65  ../* It got an e
1c00: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68  rror - reject th
1c10: 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09 09  e certificate...
1c20: 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f  */.#if (TCL_MAJO
1c30: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20  R_VERSION == 8) 
1c40: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45  && (TCL_MINOR_VE
1c50: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f  RSION < 6)..Tcl_
1c60: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
1c70: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09  interp);.#else..
1c80: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78  Tcl_BackgroundEx
1c90: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  ception(interp, 
1ca0: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 6f  code);.#endif..o
1cb0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  k = 0;.    } els
1cc0: 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63  e {..result = Tc
1cd0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
1ce0: 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 20  nterp);..string 
1cf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
1d00: 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 26  romObj(result, &
1d10: 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e 20  length);../* An 
1d20: 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 61  empty result lea
1d30: 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ves verification
1d40: 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a 09   unchanged..*/..
1d50: 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e 55  if (string != NU
1d60: 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 30  LL && length > 0
1d70: 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d 20  ) {..    code = 
1d80: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d90: 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  j(interp, result
1da0: 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 20  , &ok);..    if 
1db0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29  (code != TCL_OK)
1dc0: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f   {.#if (TCL_MAJO
1dd0: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20  R_VERSION == 8) 
1de0: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45  && (TCL_MINOR_VE
1df0: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 6c  RSION < 6)...Tcl
1e00: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
1e10: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
1e20: 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
1e30: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
1e40: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
1e50: 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 7d  ..ok = 0;..    }
1e60: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ..}.    }.    Tc
1e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
1e80: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61  mdPtr);..    sta
1e90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  tePtr->flags &= 
1ea0: 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  ~(TLS_TCL_CALLBA
1eb0: 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  CK);..    Tcl_Re
1ec0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
1ed0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
1ee0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
1ef0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
1f00: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6f  p);.    return(o
1f10: 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c  k);./* By defaul
1f20: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63  t, leave verific
1f30: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
1f40: 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  .*/.}.../*. *---
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
1fa0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
1fb0: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66  callback with $f
1fc0: 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20  d and $msg - so 
1fd0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  the callback can
1fe0: 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20   decide. *.what 
1ff0: 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72  to do with error
2000: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  s.. *. * Side ef
2010: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72  fects:. *.The er
2020: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  r field of the c
2030: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69  urrently operati
2040: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a  ve State is set.
2050: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67   *.  to a string
2060: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
2070: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
2080: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20  failure reason. 
2090: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c  ----. */.void.Tl
20e0: 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73  s_Error(State *s
20f0: 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d  tatePtr, char *m
2100: 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e  sg) {.    Tcl_In
2110: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
2120: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
2130: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
2140: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
2150: 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  de;..    dprintf
2160: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
2170: 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 67   if (msg && *msg
2180: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  ) {..Tcl_SetErro
2190: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 53  rCode(interp, "S
21a0: 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72 20  SL", msg, (char 
21b0: 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65  *)NULL);.    } e
21c0: 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63 6c  lse {..msg = Tcl
21d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
21e0: 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  j(Tcl_GetObjResu
21f0: 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c 4c  lt(interp), NULL
2200: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
2210: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67  tePtr->err = msg
2220: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2230: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
2240: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
2250: 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46   {..char buf[BUF
2260: 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 62  SIZ];..sprintf(b
2270: 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 6c  uf, "SSL channel
2280: 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a 20   \"%s\": error: 
2290: 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 65  %s",..    Tcl_Ge
22a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
22b0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d 73  tePtr->self), ms
22c0: 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75  g);..Tcl_SetResu
22d0: 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c 20  lt(interp, buf, 
22e0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 23  TCL_VOLATILE);.#
22f0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
2300: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
2310: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
2320: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
2330: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
2340: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
2350: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
2360: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c 5f  ion(interp, TCL_
2370: 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a 09  ERROR);.#endif..
2380: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2390: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
23a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
23b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
23c0: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
23d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
23e0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
23f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2400: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
2410: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2420: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2430: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
2440: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2450: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2460: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2470: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2480: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2490: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
24a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
24b0: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
24c0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  1));..    Tcl_Pr
24d0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
24e0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
24f0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
2500: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
2510: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
2520: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2530: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
2540: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
2550: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
2560: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
2570: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
2580: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
2590: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
25a0: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
25b0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
25c0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
25d0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
25e0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
25f0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
2600: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
2610: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
2620: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2630: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
2640: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
2650: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
2660: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
2670: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
2680: 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  terp);.}.../*. *
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67  ---. *. * KeyLog
26e0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
26f0: 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64  *.Write received
2700: 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67   key data to log
2710: 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64   file.. *. * Sid
2720: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
2730: 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ne. *-----------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
2780: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  d KeyLogCallback
2790: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
27a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e   const char *lin
27b0: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  e) {.    char *s
27c0: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b  tr = getenv(SSLK
27d0: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20  EYLOGFILE);.    
27e0: 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 66  FILE *fd;.    if
27f0: 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66   (str) {..fd = f
2800: 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a  open(str, "a");.
2810: 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73  .fprintf(fd, "%s
2820: 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f  \n",line);..fclo
2830: 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a  se(fd);.    }.}.
2840: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2890: 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61   Password Callba
28a0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  ck --. *. *.Call
28b0: 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f  ed when a passwo
28c0: 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  rd is needed to 
28d0: 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20 50  unpack RSA and P
28e0: 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c  EM keys.. *.Eval
28f0: 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 73  s any bound pass
2900: 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64 20  word script and 
2910: 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 75  returns the resu
2920: 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73  lt as. *.the pas
2930: 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a  sword string.. *
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
2990: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  nt.PasswordCallb
29a0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69  ack(char *buf, i
29b0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72  nt size, int ver
29c0: 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 61  ify, void *udata
29d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
29e0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
29f0: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54   *) udata;.    T
2a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a10: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
2a20: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
2a30: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
2a40: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70  nt code;..    dp
2a50: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
2a60: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
2a70: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20  tr->password == 
2a80: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c  NULL) {..if (Tcl
2a90: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20  _EvalEx(interp, 
2aa0: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c  "tls::password",
2ab0: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
2ac0: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  OBAL) == TCL_OK)
2ad0: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
2ae0: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
2af0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
2b00: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73  (interp);..    s
2b10: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
2b20: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
2b30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
2b40: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09  t)strlen(ret);..
2b50: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
2b60: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20  turn -1;..}.    
2b70: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  }..    cmdPtr = 
2b80: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2b90: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
2ba0: 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  ord);..    Tcl_P
2bb0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2bc0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
2bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
2be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
2bf0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ePtr);..    Tcl_
2c00: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
2c10: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  Ptr);.    code =
2c20: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
2c30: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2c40: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
2c50: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d  .    if (code !=
2c60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28   TCL_OK) {.#if (
2c70: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
2c80: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
2c90: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
2ca0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
2cb0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
2cc0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
2cd0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
2ce0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
2cf0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2d00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2d10: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54  (cmdPtr);..    T
2d20: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
2d30: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
2d40: 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 65  );..    if (code
2d50: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63   == TCL_OK) {..c
2d60: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
2d70: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
2d80: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
2d90: 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 74  ..if (strlen(ret
2da0: 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b 0a  ) < size - 1) {.
2db0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
2dc0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
2dd0: 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f  size);..    Tcl_
2de0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
2df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 20  ata) interp);.. 
2e00: 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73     return (int)s
2e10: 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a 20  trlen(ret);..}. 
2e20: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c     }.    Tcl_Rel
2e30: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
2e40: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
2e50: 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 66  eturn -1;..verif
2e60: 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a  y = verify;.}...
2e70: 2f 2a 0a 20 2a 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 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
2ec0: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20  ession Callback 
2ed0: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20  for Clients --. 
2ee0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
2ef0: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69   a new session i
2f00: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
2f10: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33  ache. In TLS 1.3
2f20: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20  . *.this may be 
2f30: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
2f40: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68  e times after th
2f50: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72  e handshake. For
2f60: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73  . *.earlier vers
2f70: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  ions, this will 
2f80: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69  be received duri
2f90: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ng the handshake
2fa0: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65  .. *.This is the
2fb0: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74   preferred way t
2fc0: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d  o obtain a resum
2fd0: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a  able session.. *
2fe0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
2ff0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
3000: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
3010: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
3020: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
3030: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30  turn codes:. *.0
3040: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73   = error where s
3050: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69  ession will be i
3060: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76  mmediately remov
3070: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ed from the inte
3080: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31  rnal cache.. *.1
3090: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65   = success where
30a0: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73   app retains ses
30b0: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20  sion in session 
30c0: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20  cache, and must 
30d0: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  call SSL_SESSION
30e0: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e  _free() when don
30f0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3140: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69  static int.Sessi
3150: 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  onCallback(const
3160: 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53   SSL *ssl, SSL_S
3170: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29  ESSION *session)
3180: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
3190: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
31a0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
31b0: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
31c0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
31d0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
31e0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
31f0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
3200: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
3210: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
3220: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
3230: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
3240: 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  _id;.    int cod
3250: 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  e;.    size_t le
3260: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  n2;.    unsigned
3270: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20   int ulen;..    
3280: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3290: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
32a0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
32b0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
32c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
32d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
32e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73     } else if (ss
32f0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  l == NULL) {..re
3300: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
3310: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
3320: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  ..    cmdPtr = T
3330: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
3340: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
3350: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
3360: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3370: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3380: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3390: 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31  bj("session", -1
33a0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
33b0: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65  ion id */.    se
33c0: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
33d0: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
33e0: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20  ssion, &ulen);. 
33f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3400: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3410: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3420: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
3430: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74  session_id, (int
3440: 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f  ) ulen));..    /
3450: 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
3460: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53   */.    SSL_SESS
3470: 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28  ION_get0_ticket(
3480: 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
3490: 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63  , &len2);.    Tc
34a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
34b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
34c0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
34d0: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65  teArrayObj(ticke
34e0: 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b  t, (int) len2));
34f0: 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d  ..    /* Lifetim
3500: 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  e - number of se
3510: 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c  conds */.    Tcl
3520: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3530: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3540: 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f  dPtr,..Tcl_NewLo
3550: 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c  ngObj((long) SSL
3560: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
3570: 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
3580: 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20  t(session)));.. 
3590: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
35a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
35b0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
35c0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
35d0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
35e0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
35f0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
3600: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61    code = Tcl_Eva
3610: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63  lObjEx(interp, c
3620: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f  mdPtr, TCL_EVAL_
3630: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20  GLOBAL);.    if 
3640: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29  (code != TCL_OK)
3650: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f   {.#if (TCL_MAJO
3660: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20  R_VERSION == 8) 
3670: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45  && (TCL_MINOR_VE
3680: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f  RSION < 6)..Tcl_
3690: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
36a0: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09  interp);.#else..
36b0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78  Tcl_BackgroundEx
36c0: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  ception(interp, 
36d0: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  code);.#endif.  
36e0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
36f0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3700: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  ;..    Tcl_Relea
3710: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3720: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
3730: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3740: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3750: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
3760: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
37b0: 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66   ALPN Callback f
37c0: 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 43  or Servers and C
37d0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
37e0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c  Perform protocol
37f0: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20   (http/1.1, h2, 
3800: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74  h3, etc.) select
3810: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69  ion for the. *.i
3820: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
3830: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  on. Called after
3840: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65   Hello and serve
3850: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09  r callbacks.. *.
3860: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73  Where 'out' is s
3870: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
3880: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65   and 'in' is the
3890: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64   peer advertised
38a0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   list.. *. * Res
38b0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
38c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
38d0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
38e0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
38f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
3900: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
3910: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20  XT_ERR_OK: ALPN 
3920: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
3930: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
3940: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
3950: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
3960: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72  LERT_FATAL: Ther
3970: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70  e was no overlap
3980: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69   between the cli
3990: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70  ent's. *.    sup
39a0: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74  plied list and t
39b0: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67  he server config
39c0: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  uration. The con
39d0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
39e0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f  aborted.. *.SSL_
39f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
3a00: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  : ALPN protocol 
3a10: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e  not selected, e.
3a20: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41  g., because no A
3a30: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f  LPN. *.    proto
3a40: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75  cols are configu
3a50: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e  red for this con
3a60: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  nection. The con
3a70: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
3a80: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3ad0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43  static int.ALPNC
3ae0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
3af0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
3b00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
3b10: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
3b20: 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74   *outlen,..const
3b30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3b40: 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  in, unsigned int
3b50: 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72   inlen, void *ar
3b60: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
3b70: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
3b80: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
3b90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
3ba0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
3bb0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
3bc0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
3bd0: 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20  code, res;..    
3be0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3bf0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20  );..    if (ssl 
3c00: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d  == NULL || arg =
3c10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
3c20: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
3c30: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
3c40: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f     /* Select pro
3c50: 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20  tocol */.    if 
3c60: 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74  (SSL_select_next
3c70: 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c  _proto(out, outl
3c80: 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72  en, statePtr->pr
3c90: 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e  otos, statePtr->
3ca0: 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c  protos_len,..in,
3cb0: 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53   inlen) == OPENS
3cc0: 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45  SL_NPN_NEGOTIATE
3cd0: 44 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  D) {..res = SSL_
3ce0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
3cf0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
3d00: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
3d10: 73 65 20 66 69 72 73 74 20 63 6c 69 65 6e 74 20  se first client 
3d20: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 72 65 73  protocol */..res
3d30: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
3d40: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
3d50: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3d60: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
3d70: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
3d80: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
3d90: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
3da0: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  ..    cmdPtr = T
3db0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
3dc0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
3dd0: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
3de0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3df0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3e00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3e10: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b  bj("alpn", -1));
3e20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3e30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3e40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3e50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a  l_NewStringObj(*
3e60: 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  out, -1));..    
3e70: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
3e80: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
3e90: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  );.    Tcl_Prese
3ea0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3eb0: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3ec0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
3ed0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63  t(cmdPtr);.    c
3ee0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
3ef0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
3f00: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
3f10: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
3f20: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de != TCL_OK) {.
3f30: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
3f40: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
3f50: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
3f60: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
3f70: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
3f80: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
3f90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
3fa0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64  tion(interp, cod
3fb0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
3fc0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3fd0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
3fe0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3ff0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
4000: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
4010: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
4020: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
4030: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
4040: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4090: 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f   Advertise Proto
40a0: 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f  cols Callback fo
40b0: 72 20 53 65 72 76 65 72 73 20 4e 65 78 74 20 50  r Servers Next P
40c0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
40d0: 69 6f 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c  ion --. *. *.cal
40e0: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73  led when a TLS s
40f0: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69  erver needs a li
4100: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20  st of supported 
4110: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65  protocols for Ne
4120: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e  xt. *.Protocol N
4130: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20  egotiation.. *. 
4140: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
4150: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
4160: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74  fects:. *. * Ret
4170: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
4180: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
4190: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65   NPN protocol se
41a0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
41b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
41c0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
41d0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70  ERR_NOACK: NPN p
41e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
41f0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
4200: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
4210: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66  --------. */.#if
4260: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74  def USE_NPN.stat
4270: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61  ic int.NPNCallba
4280: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
4290: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
42a0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
42b0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c  signed int *outl
42c0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
42d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
42e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
42f0: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  rg;..    dprintf
4300: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4310: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4320: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
4330: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4340: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4360: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  et protocols lis
4370: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
4380: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
4390: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d   NULL) {..*out =
43a0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
43b0: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74  s;..*outlen = st
43c0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
43d0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
43e0: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09  ..*out = NULL;..
43f0: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65  *outlen = 0;..re
4400: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4410: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4420: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f  .    return SSL_
4430: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d  TLSEXT_ERR_OK;.}
4440: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4490: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c  --. *. * SNI Cal
44a0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
44b0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
44c0: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53  rm server-side S
44d0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65  NI hostname sele
44e0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65  ction after rece
44f0: 69 76 69 6e 67 20 53 4e 49 20 68 65 61 64 65 72  iving SNI header
4500: 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 61 66 74 65  .. *.Called afte
4510: 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b  r hello callback
4520: 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e   but before ALPN
4530: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
4540: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4550: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4560: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4570: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4580: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4590: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
45a0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53  TLSEXT_ERR_OK: S
45b0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  NI hostname is a
45c0: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e  ccepted. The con
45d0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
45e0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
45f0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
4600: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
4610: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20  s not accepted. 
4620: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  The connection. 
4630: 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64  *.    is aborted
4640: 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c  . Default for al
4650: 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e  ert is SSL_AD_UN
4660: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e  RECOGNIZED_NAME.
4670: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4680: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
4690: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
46a0: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20  s not accepted, 
46b0: 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a  warning alert. *
46c0: 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 69  .    sent (not i
46d0: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20  n TLSv1.3). The 
46e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
46f0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4700: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53  EXT_ERR_NOACK: S
4710: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
4720: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20  ot accepted and 
4730: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64  not acknowledged
4740: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66  ,. *.    e.g. if
4750: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65   SNI has not bee
4760: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68  n configured. Th
4770: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4780: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
47e0: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  SNICallback(cons
47f0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
4800: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72  *alert, void *ar
4810: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
4820: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
4830: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
4840: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
4850: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
4860: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
4870: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
4880: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
4890: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c  servername = NUL
48a0: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  L;..    dprintf(
48b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
48c0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
48d0: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
48e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
48f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4900: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65      }..    serve
4910: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f  rname = SSL_get_
4920: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
4930: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
4940: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  host_name);.    
4950: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20  if (!servername 
4960: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d  || servername[0]
4970: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20   == '\0') {.    
4980: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
4990: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
49a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
49b0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
49c0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
49d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
49e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
49f0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d  K;.    }..    cm
4a00: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
4a10: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
4a20: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
4a30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4a40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4a50: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4a60: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
4a70: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4a80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4a90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4aa0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4ab0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
4ac0: 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63   , -1));..    Tc
4ad0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
4ae0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
4af0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
4b00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
4b10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54  tatePtr);..    T
4b20: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4b30: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64  cmdPtr);.    cod
4b40: 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  e = Tcl_EvalObjE
4b50: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  x(interp, cmdPtr
4b60: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
4b70: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65  L);.    if (code
4b80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69   != TCL_OK) {.#i
4b90: 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  f (TCL_MAJOR_VER
4ba0: 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54  SION == 8) && (T
4bb0: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e  CL_MINOR_VERSION
4bc0: 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67   < 6)..Tcl_Backg
4bd0: 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72  roundError(inter
4be0: 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42  p);.#else..Tcl_B
4bf0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69  ackgroundExcepti
4c00: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29  on(interp, code)
4c10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
4c20: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4c30: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20  unt(cmdPtr);..  
4c40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
4c50: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
4c60: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65  Ptr);.    Tcl_Re
4c70: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
4c80: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
4c90: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4ca0: 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  T_ERR_OK;.}.../*
4cb0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c  ------. *. * Hel
4d00: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c  lo Handshake Cal
4d10: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
4d20: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20  s --. *. *.Used 
4d30: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61  by server to exa
4d40: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20  mine the server 
4d50: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
4d60: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a  (SNI) extension.
4d70: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74   *.provided by t
4d80: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64  he client in ord
4d90: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20  er to select an 
4da0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74  appropriate cert
4db0: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72  ificate to. *.pr
4dc0: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20  esent, and make 
4dd0: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
4de0: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ion adjustments 
4df0: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74  relevant to that
4e00: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20   server. *.name 
4e10: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72  and its configur
4e20: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c  ation. This incl
4e30: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75  udes swapping ou
4e40: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
4e50: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e  . *.SSL_CTX poin
4e60: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74  ter, modifying t
4e70: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74  he server's list
4e80: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c   of permitted TL
4e90: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63  S versions,. *.c
4ea0: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76  hanging the serv
4eb0: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  er's cipher list
4ec0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
4ed0: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70  the client's cip
4ee0: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20  her list, etc.. 
4ef0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4f00: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4f10: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4f20: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4f30: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
4f40: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
4f50: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
4f60: 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 6e 64  _RETRY = suspend
4f70: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20   the handshake, 
4f80: 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b  and the handshak
4f90: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  e function will 
4fa0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
4fb0: 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  ly. *.SSL_CLIENT
4fc0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20 66  _HELLO_ERROR = f
4fd0: 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74  ailure, terminat
4fe0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65  e connection. Se
4ff0: 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72  t alert to error
5000: 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c   code.. *.SSL_CL
5010: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
5020: 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 2a 0a  SS = success. *.
5030: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
5080: 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61   int.HelloCallba
5090: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
50a0: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
50b0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
50c0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
50d0: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
50e0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
50f0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
5100: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
5110: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
5120: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
5130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
5140: 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  vername;.    con
5150: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5160: 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20   *p;.    size_t 
5170: 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a  len, remaining;.
5180: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5190: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
51a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
51b0: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
51c0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
51d0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
51e0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
51f0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
5200: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5210: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5220: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
5230: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5240: 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20     /* Get names 
5250: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
5260: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74  client_hello_get
5270: 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58  0_ext(ssl, TLSEX
5280: 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61  T_TYPE_server_na
5290: 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69  me, &p, &remaini
52a0: 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67  ng) || remaining
52b0: 20 3c 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 20   <= 2) {.       
52c0: 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45   return SSL_CLIE
52d0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
52e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
52f0: 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68  tract the length
5300: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
5310: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20   list of names. 
5320: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28  */.    len = (*(
5330: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20  p++) << 8);.    
5340: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20  len += *(p++);. 
5350: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21     if (len + 2 !
5360: 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 20  = remaining) {. 
5370: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53         return SS
5380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
5390: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
53a0: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b  remaining = len;
53b0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73  ..    /* The lis
53c0: 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e  t in practice on
53d0: 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20  ly has a single 
53e0: 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f  element, so we o
53f0: 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65  nly consider the
5400: 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20   first one. */. 
5410: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67     if (remaining
5420: 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d   == 0 || *p++ !=
5430: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
5440: 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 20 20  _host_name) {.  
5450: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c        return SSL
5460: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
5470: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
5480: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
5490: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
54a0: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
54b0: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
54c0: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
54d0: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
54e0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
54f0: 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65   2) {.        re
5500: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
5510: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
5520: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28   }.    len = (*(
5530: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20  p++) << 8);.    
5540: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20  len += *(p++);. 
5550: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e     if (len + 2 >
5560: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20   remaining) {.  
5570: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c        return SSL
5580: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
5590: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
55a0: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a  emaining = len;.
55b0: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
55c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
55d0: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  ;..    cmdPtr = 
55e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
55f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
5600: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
5610: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5620: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5630: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5640: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29  Obj("hello", -1)
5650: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
5680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5690: 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e  (servername, (in
56a0: 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 54  t) len));..    T
56b0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
56c0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
56d0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
56e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
56f0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
5700: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5710: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
5720: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
5730: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
5740: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
5750: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
5760: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
5770: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
5780: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
5790: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
57a0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
57b0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
57c0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
57d0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
57e0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
57f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
5800: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5810: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
5820: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
5830: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
5840: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
5850: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
5860: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
5870: 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45   return SSL_CLIE
5880: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
5890: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
58a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
58b0: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20  Commands        
58c0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
58e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5920: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65  ----. *. * Ciphe
5930: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  rsObjCmd -- list
5940: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
5950: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  rs. *. *.This pr
5960: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
5970: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
5980: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  e "tls::ciphers"
5990: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
59a0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
59b0: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f  phers, based upo
59c0: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  n protocol selec
59d0: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ted.. *. * Resul
59e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
59f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
5a00: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
5a10: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
5a20: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79  ucts and destroy
5a30: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
5a40: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5a90: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5aa0: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20  ar *protocols[] 
5ab0: 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73  = {.."ssl2", "ss
5ac0: 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c  l3", "tls1", "tl
5ad0: 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c  s1.1", "tls1.2",
5ae0: 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a   "tls1.3", NULL.
5af0: 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c  };.enum protocol
5b00: 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c   {.    TLS_SSL2,
5b10: 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54   TLS_SSL3, TLS_T
5b20: 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c  LS1, TLS_TLS1_1,
5b30: 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53   TLS_TLS1_2, TLS
5b40: 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e  _TLS1_3, TLS_NON
5b50: 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  E.};..static int
5b60: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43  .CiphersObjCmd(C
5b70: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
5b80: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
5b90: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
5ba0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
5bb0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
5bc0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
5bd0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
5be0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
5bf0: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
5c00: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
5c10: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
5c20: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  *sk;.    char *c
5c30: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  p, buf[BUFSIZ];.
5c40: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
5c50: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f  erbose = 0, use_
5c60: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a  supported = 0;..
5c70: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5c80: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
5c90: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f  (objc < 2) || (o
5ca0: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c  bjc > 4)) {..Tcl
5cb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5cc0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
5cd0: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73  protocol ?verbos
5ce0: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29  e? ?supported?")
5cf0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5d00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
5d10: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
5d20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
5d30: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
5d40: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
5d50: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
5d60: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
5d70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5d80: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
5d90: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
5da0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
5db0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
5dc0: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
5dd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5de0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
5df0: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20   if ((objc > 3) 
5e00: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
5e10: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
5e20: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73   objv[3], &use_s
5e30: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c  upported) != TCL
5e40: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
5e50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5e60: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
5e70: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69  rror();..    swi
5e80: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f  tch ((enum proto
5e90: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61  col)index) {..ca
5ea0: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66  se TLS_SSL2:.#if
5eb0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
5ec0: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
5ed0: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
5ee0: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
5ef0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
5f00: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f  _SSL2)..    Tcl_
5f10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
5f20: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
5f30: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
5f40: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
5f50: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
5f60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5f70: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20  .#else..    ctx 
5f80: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53  = SSL_CTX_new(SS
5f90: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  Lv2_method()); b
5fa0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
5fb0: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
5fc0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
5fd0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
5fe0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
5ff0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
6000: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
6010: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
6020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
6030: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
6040: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
6050: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
6060: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
6070: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
6080: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
6090: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65  CTX_new(SSLv3_me
60a0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
60b0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
60c0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
60d0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
60e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
60f0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
6100: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
6110: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
6120: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6130: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
6140: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
6150: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
6160: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
6170: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6180: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
6190: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
61a0: 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29  w(TLSv1_method()
61b0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
61c0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
61d0: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
61e0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
61f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
6200: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
6210: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
6220: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_1_METHOD)..  
6230: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6240: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
6250: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
6260: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
6270: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
6280: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6290: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
62a0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
62b0: 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68  new(TLSv1_1_meth
62c0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
62d0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
62e0: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_2:.#if defin
62f0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
6300: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
6310: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
6320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6330: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
6340: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
6350: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
6360: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
6370: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
6380: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
6390: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
63a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
63b0: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
63c0: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f  CTX_new(TLSv1_2_
63d0: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
63e0: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
63f0: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64  LS_TLS1_3:.#if d
6400: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
6410: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
6420: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
6430: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6440: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
6450: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
6460: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
6470: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
6480: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
6490: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
64a0: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
64b0: 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f  TX_new(TLS_metho
64c0: 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d());.          
64d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69    SSL_CTX_set_mi
64e0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
64f0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
6500: 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ION);..    SSL_C
6510: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
6520: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
6530: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
6540: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69      break;.#endi
6550: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
6560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6570: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
6580: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
6590: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52  Result(interp, R
65a0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
65b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
65c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73  R;.    }..    ss
65d0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29  l = SSL_new(ctx)
65e0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ;.    if (ssl ==
65f0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
6600: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6610: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  p, REASON(), NUL
6620: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
6630: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
6640: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6650: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73  ..    /* Use lis
6660: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77  t and order as w
6670: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20  ould be sent in 
6680: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72  a ClientHello or
6690: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63   all available c
66a0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66  iphers */.    if
66b0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
66c0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
66d0: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68  1_supported_ciph
66e0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20  ers(ssl);.    } 
66f0: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c  else {..sk = SSL
6700: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c  _get_ciphers(ssl
6710: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
6720: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a   (sk != NULL) {.
6730: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b  .if (!verbose) {
6740: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
6750: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
6760: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72   NULL);..    for
6770: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
6780: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e   sk_SSL_CIPHER_n
6790: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09  um(sk); i++) {..
67a0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45  .const SSL_CIPHE
67b0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49  R *c = sk_SSL_CI
67c0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69  PHER_value(sk, i
67d0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55  );...if (c == NU
67e0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09  LL) continue;...
67f0: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20  ./* cipher name 
6800: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63  or (NONE) */...c
6810: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  p = SSL_CIPHER_g
6820: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66  et_name(c);...if
6830: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72   (cp == NULL) br
6840: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  eak;...Tcl_ListO
6850: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6860: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
6870: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6880: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  (cp, -1));..    
6890: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
68a0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
68b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
68c0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
68d0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
68e0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
68f0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
6900: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
6910: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
6920: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
6930: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
6940: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
6950: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
6960: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
6970: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
6980: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
6990: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
69a0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
69b0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
69c0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
69d0: 75 66 2c 20 28 69 6e 74 29 20 73 74 72 6c 65 6e  uf, (int) strlen
69e0: 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65  (buf));...} else
69f0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
6a00: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c  endToObj(objPtr,
6a10: 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29   "UNKNOWN\n", 8)
6a20: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a  ;...}..    }..}.
6a30: 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74  .if (use_support
6a40: 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53  ed) {..    sk_SS
6a50: 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b  L_CIPHER_free(sk
6a60: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  );..}.    }.    
6a70: 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20  SSL_free(ssl);. 
6a80: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
6a90: 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  ctx);..    Tcl_S
6aa0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6ab0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
6ac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6ad0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
6ae0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
6af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f  ------. *. * Pro
6b40: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20  tocolsObjCmd -- 
6b50: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
6b60: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54  rotocols. *. *.T
6b70: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6b80: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6b90: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72  ess the "tls::pr
6ba0: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64  otocols" command
6bb0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
6bc0: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e  lable protocols.
6bd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6be0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
6bf0: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
6c00: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6c10: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
6c70: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  nt.ProtocolsObjC
6c80: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
6c90: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
6ca0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
6cb0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
6cc0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
6cd0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
6ce0: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  jPtr;..    dprin
6cf0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
6d00: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31     if (objc != 1
6d10: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
6d20: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
6d30: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74   objv, "");..ret
6d40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6d50: 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72     }..    objPtr
6d60: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
6d70: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66  j(0, NULL);..#if
6d80: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
6d90: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
6da0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
6db0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
6dc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6dd0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
6de0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6df0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
6e00: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
6e10: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
6e20: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b  TLS_SSL2], -1));
6e30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
6e40: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
6e50: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
6e60: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54  L_NO_SSL3).    T
6e70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6e80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6e90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
6ea0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
6eb0: 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31  ls[TLS_SSL3], -1
6ec0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
6ed0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
6ee0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
6ef0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
6f00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6f10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6f20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
6f30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
6f40: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c  ocols[TLS_TLS1],
6f50: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
6f60: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
6f70: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
6f80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
6f90: 31 5f 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_1).    Tcl_Lis
6fa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6fb0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
6fc0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6fd0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
6fe0: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_1], -1));.
6ff0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
7000: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
7010: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
7020: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
7030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
7050: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
7060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
7070: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32  ocols[TLS_TLS1_2
7080: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
7090: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
70a0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
70b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
70c0: 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c  LS1_3).    Tcl_L
70d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
70e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
70f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
7100: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
7110: 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29  LS_TLS1_3], -1))
7120: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
7130: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
7140: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
7150: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
7160: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
7170: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
7180: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
71d0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20  HandshakeObjCmd 
71e0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f  --. *. *.This co
71f0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
7200: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20   verify whether 
7210: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73  the handshake is
7220: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20   complete. *.or 
7230: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  not.. *. * Resul
7240: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
7250: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20  d Tcl result. 1 
7260: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20  means handshake 
7270: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e  complete, 0 mean
7280: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a  s pending.. *. *
7290: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
72a0: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20  *.May force SSL 
72b0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74  negotiation to t
72c0: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a  ake place.. *. *
72d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7310: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
7320: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43  nt HandshakeObjC
7330: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
7340: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
7350: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7360: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
7370: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
7380: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
7390: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a   chan;        /*
73a0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
73b0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
73c0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
73d0: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a  tePtr;        /*
73e0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
73f0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
7400: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7410: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  errStr = NULL;. 
7420: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a     int ret = 1;.
7430: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b      int err = 0;
7440: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
7450: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
7460: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
7470: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7480: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7490: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
74a0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
74b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
74c0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
74d0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
74e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
74f0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20  objv[1], NULL), 
7500: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
7510: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
7520: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
7530: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
7540: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
7550: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
7560: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
7570: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
7580: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
7590: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
75a0: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
75b0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
75c0: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
75d0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
75e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
75f0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
7600: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
7610: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
7620: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
7630: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
7640: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
7650: 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  OR);.    }.    s
7660: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
7670: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
7680: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
7690: 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  an);..    dprint
76a0: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
76b0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
76c0: 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57  .    ret = Tls_W
76d0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
76e0: 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29  atePtr, &err, 1)
76f0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ;.    dprintf("T
7700: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
7710: 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c  t returned: %i",
7720: 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28   ret);..    if (
7730: 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61  ret < 0 && ((sta
7740: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
7750: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26  LS_TCL_ASYNC) &&
7760: 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29   (err == EAGAIN)
7770: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  )) {..dprintf("A
7780: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72  sync set and err
7790: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65   = EAGAIN");..re
77a0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  t = 0;.    } els
77b0: 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b  e if (ret < 0) {
77c0: 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65  ..errStr = state
77d0: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52  Ptr->err;..Tcl_R
77e0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
77f0: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  p);..Tcl_SetErrn
7800: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65  o(err);...if (!e
7810: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74  rrStr || (*errSt
7820: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  r == 0)) {..    
7830: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73  errStr = Tcl_Pos
7840: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ixError(interp);
7850: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  ..}...Tcl_Append
7860: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7870: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
7880: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68  : ", errStr, (ch
7890: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70  ar *) NULL);..dp
78a0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
78b0: 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20   TCL_ERROR with 
78c0: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
78d0: 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a  : %s", errStr);.
78e0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
78f0: 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  R);.    } else {
7900: 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20  ..if (err != 0) 
7910: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
7920: 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74  Got an error wit
7930: 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61  h a completed ha
7940: 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25  ndshake: err = %
7950: 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65  i", err);..}..re
7960: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
7970: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
7980: 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68  ning TCL_OK with
7990: 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72   data \"%i\"", r
79a0: 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  et);.    Tcl_Set
79b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
79c0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
79d0: 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ret));.    retur
79e0: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65  n(TCL_OK);..clie
79f0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
7a00: 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ata;.}../*. *---
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a50: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
7a60: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
7a70: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
7a80: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
7a90: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
7aa0: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
7ab0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
7ac0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
7ad0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
7ae0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
7af0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
7b00: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
7b10: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
7b20: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
7b30: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
7b40: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
7b50: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
7ba0: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
7bb0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
7bc0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
7bd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7be0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7bf0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7c00: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
7c10: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
7c20: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
7c30: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
7c40: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
7c50: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
7c60: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
7c70: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
7c80: 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 20  _CTX *ctx.      
7c90: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63    = NULL;.    Tc
7ca0: 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20  l_Obj *script.  
7cb0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7cc0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77    Tcl_Obj *passw
7cd0: 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ord.        = NU
7ce0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
7cf0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
7d00: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
7d10: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
7d20: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
7d30: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
7d40: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
7d50: 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a    int idx, len;.
7d60: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20      int flags.. 
7d70: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c         = TLS_TCL
7d80: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
7d90: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d  erver..        =
7da0: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
7db0: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
7dc0: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
7dd0: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09    char *keyfile.
7de0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7df0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
7e00: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
7e10: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
7e20: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55  char *key  .= NU
7e30: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  LL;.    int key_
7e40: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
7e50: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73      = 0;.    uns
7e60: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
7e70: 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b           = NULL;
7e80: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65  .    int cert_le
7e90: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
7ea0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
7eb0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
7ec0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
7ed0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
7ee0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
7ef0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
7f00: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7f10: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
7f20: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7f30: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
7f40: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
7f50: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
7f60: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
7f70: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
7f80: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
7f90: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
7fa0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
7fb0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
7fc0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
7fd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
7fe0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
7ff0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70      Tcl_Obj *alp
8000: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  n..= NULL;.    i
8010: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
8020: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
8030: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
8040: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
8050: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
8060: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
8070: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
8080: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
8090: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
80a0: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
80b0: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20  andshake = 0;.. 
80c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
80d0: 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ed");..#if OPENS
80e0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
80f0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
8100: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8110: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20  SSL_NO_SSL2) && 
8120: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
8130: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
8140: 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64  SSL3) && defined
8150: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66  (NO_TLS1) && def
8160: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
8170: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
8180: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64  S1_2) && defined
8190: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  (NO_TLS1_3).    
81a0: 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl2 = 1;.#endif
81b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50  .#if !defined(OP
81c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
81d0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
81e0: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  L3) && defined(N
81f0: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e  O_SSL2) && defin
8200: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64  ed(NO_TLS1) && d
8210: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
8220: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
8230: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e  TLS1_2) && defin
8240: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  ed(NO_TLS1_3).  
8250: 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64    ssl3 = 1;.#end
8260: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
8270: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
8280: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8290: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30  S1).    tls1 = 0
82a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
82b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
82c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
82d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
82e0: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65    tls1_1 = 0;.#e
82f0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
8300: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
8310: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8320: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c  O_TLS1_2).    tl
8330: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_2 = 0;.#endif
8340: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
8350: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
8360: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8370: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33  S1_3).    tls1_3
8380: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
8390: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
83a0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
83b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
83c0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f  bjv, "channel ?o
83d0: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ptions?");..retu
83e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
83f0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
8400: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
8410: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
8420: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8430: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c  [1], NULL), NULL
8440: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
8450: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
8460: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
8470: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8480: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
8490: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
84a0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
84b0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
84c0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
84d0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
84e0: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20    for (idx = 2; 
84f0: 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b  idx < objc; idx+
8500: 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20  +) {..char *opt 
8510: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8520: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d  romObj(objv[idx]
8530: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f  , NULL);...if (o
8540: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20  pt[0] != '-').. 
8550: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53     break;...OPTS
8560: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64  TR("-cadir", CAd
8570: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  ir);..OPTSTR("-c
8580: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
8590: 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66  ..OPTSTR("-certf
85a0: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b  ile", certfile);
85b0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
85c0: 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  r", ciphers);..O
85d0: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22  PTSTR("-ciphers"
85e0: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54  , ciphers);..OPT
85f0: 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74  STR("-ciphersuit
8600: 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65  es", ciphersuite
8610: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f  s);..OPTOBJ("-co
8620: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b  mmand", script);
8630: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72  ..OPTSTR("-dhpar
8640: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b  ams", DHparams);
8650: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69  ..OPTSTR("-keyfi
8660: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09  le", keyfile);..
8670: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c  OPTSTR("-model",
8680: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a   model);..OPTOBJ
8690: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61  ("-password", pa
86a0: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f  ssword);..OPTBOO
86b0: 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  L("-post_handsha
86c0: 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68  ke", post_handsh
86d0: 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ake);..OPTBOOL("
86e0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69  -require", requi
86f0: 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  re);..OPTBOOL("-
8700: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73  request", reques
8710: 74 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65  t);..OPTINT("-se
8720: 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65  curitylevel", le
8730: 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  vel);..OPTBOOL("
8740: 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72  -server", server
8750: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72  );..OPTSTR("-ser
8760: 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72  vername", server
8770: 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  name);..OPTSTR("
8780: 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65  -session_id", se
8790: 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 4f  ssion_id);..OPTO
87a0: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e  BJ("-alpn", alpn
87b0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
87c0: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54  l2", ssl2);..OPT
87d0: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73  BOOL("-ssl3", ss
87e0: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l3);..OPTBOOL("-
87f0: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f  tls1", tls1);..O
8800: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22  PTBOOL("-tls1.1"
8810: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42  , tls1_1);..OPTB
8820: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74  OOL("-tls1.2", t
8830: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c  ls1_2);..OPTBOOL
8840: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31  ("-tls1.3", tls1
8850: 5f 33 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  _3);..OPTBYTE("-
8860: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72  cert", cert, cer
8870: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 42 59 54 45  t_len);..OPTBYTE
8880: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65  ("-key", key, ke
8890: 79 5f 6c 65 6e 29 3b 0a 0a 09 4f 50 54 42 41 44  y_len);...OPTBAD
88a0: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70  ("option", "-alp
88b0: 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69  n, -cadir, -cafi
88c0: 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74  le, -cert, -cert
88d0: 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d  file, -cipher, -
88e0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63  ciphersuites, -c
88f0: 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d  ommand, -dhparam
8900: 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c  s, -key, -keyfil
8910: 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73  e, -model, -pass
8920: 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 65 2c 20  word, -require, 
8930: 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 63 75 72  -request, -secur
8940: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65  itylevel, -serve
8950: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
8960: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73  -session_id, -ss
8970: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31  l2, -ssl3, -tls1
8980: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31  , -tls1.1, -tls1
8990: 2e 32 2c 20 6f 72 20 2d 74 6c 73 31 2e 33 22 29  .2, or -tls1.3")
89a0: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
89b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
89c0: 69 66 20 28 72 65 71 75 65 73 74 29 09 20 20 20  if (request).   
89d0: 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56   verify |= SSL_V
89e0: 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
89f0: 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  E | SSL_VERIFY_P
8a00: 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71  EER;.    if (req
8a10: 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29  uest && require)
8a20: 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56   verify |= SSL_V
8a30: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
8a40: 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20  _PEER_CERT;.    
8a50: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
8a60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 20  ost_handshake)  
8a70: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
8a80: 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48  RIFY_POST_HANDSH
8a90: 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72  AKE;.    if (ver
8aa0: 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79  ify == 0).verify
8ab0: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
8ac0: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
8ad0: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
8ae0: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
8af0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
8b00: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
8b10: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
8b20: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
8b30: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
8b40: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8b50: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
8b60: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
8b70: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
8b80: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
8b90: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
8ba0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
8bb0: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
8bc0: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
8bd0: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
8be0: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
8bf0: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
8c00: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
8c10: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
8c20: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
8c30: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
8c40: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
8c50: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
8c60: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8c70: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
8c80: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
8c90: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
8ca0: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
8cb0: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
8cc0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
8cd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8ce0: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
8cf0: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
8d00: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
8d10: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
8d20: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a  phersuites && !*
8d30: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69  ciphersuites) ci
8d40: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20  phersuites    = 
8d50: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
8d60: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
8d70: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
8d80: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8d90: 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26  .    if (CAdir &
8da0: 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20  & !*CAdir).     
8db0: 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20     CAdir.       
8dc0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
8dd0: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44  (DHparams && !*D
8de0: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20  Hparams).       
8df0: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20   DHparams       
8e00: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a   = NULL;..    /*
8e10: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a   new SSL state *
8e20: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09  /.    statePtr..
8e30: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c  = (State *) ckal
8e40: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73  loc((unsigned) s
8e50: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20  izeof(State));. 
8e60: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50     memset(stateP
8e70: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74  tr, 0, sizeof(St
8e80: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74  ate));..    stat
8e90: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c  ePtr->flags.= fl
8ea0: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ags;.    statePt
8eb0: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65  r->interp.= inte
8ec0: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rp;.    statePtr
8ed0: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66  ->vflags.= verif
8ee0: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  y;.    statePtr-
8ef0: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20  >err.= "";..    
8f00: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69  /* allocate scri
8f10: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63  pt */.    if (sc
8f20: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20  ript) {..(void) 
8f30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8f40: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65  mObj(script, &le
8f50: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
8f60: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
8f70: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74  allback = script
8f80: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
8f90: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
8fa0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a  ->callback);..}.
8fb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
8fc0: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20  locate password 
8fd0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77  */.    if (passw
8fe0: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ord) {..(void) T
8ff0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9000: 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c  Obj(password, &l
9010: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
9020: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
9030: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77  password = passw
9040: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ord;..    Tcl_In
9050: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
9060: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
9070: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
9080: 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29   (model != NULL)
9090: 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f   {..int mode;../
90a0: 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c  * Get the "model
90b0: 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68  " context */..ch
90c0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
90d0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65  nel(interp, mode
90e0: 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28  l, &mode);..if (
90f0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
9100: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20  nnel) NULL) {.. 
9110: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
9120: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
9130: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9140: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  ERROR;..}.../*..
9150: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20   * Make sure to 
9160: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
9170: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09  opmost channel..
9180: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
9190: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
91a0: 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65  an);..if (Tcl_Ge
91b0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
91c0: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
91d0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20  lType()) {..    
91e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
91f0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
9200: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
9210: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
9220: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
9230: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
9240: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
9250: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
9260: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
9270: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9280: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74  .}..ctx = ((Stat
9290: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
92a0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
92b0: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20  han))->ctx;.    
92c0: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63  } else {..if ((c
92d0: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74  tx = CTX_Init(st
92e0: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20  atePtr, server, 
92f0: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20  proto, keyfile, 
9300: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63  certfile, key, c
9310: 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20  ert, key_len,.. 
9320: 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64     cert_len, CAd
9330: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
9340: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
9350: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
9360: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
9370: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
9380: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
9390: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
93a0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
93b0: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
93c0: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
93d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
93e0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
93f0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
9400: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
9410: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
9420: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
9430: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
9440: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
9450: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
9460: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
9470: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
9480: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
9490: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
94a0: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
94b0: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
94c0: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
94d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
94e0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
94f0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
9500: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
9510: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
9520: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
9530: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
9540: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
9550: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
9560: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
9570: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
9580: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
9590: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
95a0: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
95b0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
95c0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
95d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
95e0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
95f0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
9600: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9610: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
9620: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9630: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
9640: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
9650: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
9660: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
9670: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9680: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9690: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
96a0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
96b0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
96c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
96d0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
96e0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
96f0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
9700: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9710: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
9720: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
9730: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
9740: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
9750: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
9760: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
9770: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
9780: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
9790: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
97a0: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
97b0: 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61  ype(), (ClientDa
97c0: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54  ta) statePtr, (T
97d0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
97e0: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
97f0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
9800: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
9810: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
9820: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
9830: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
9840: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
9850: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
9860: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9870: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
9880: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
9890: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
98a0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
98b0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
98c0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
98d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
98e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
98f0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
9900: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9910: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9920: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
9930: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
9940: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9950: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
9960: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9970: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9980: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9990: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
99a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
99b0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
99c0: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
99d0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
99e0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
99f0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
9a00: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
9a10: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
9a20: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
9a30: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9a40: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9a50: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9a60: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
9a70: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9a80: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9a90: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a  cking));..    /*
9aa0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
9ab0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
9ac0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
9ad0: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
9ae0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
9af0: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
9b00: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
9b10: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
9b20: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
9b30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
9b40: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
9b50: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
9b60: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
9b70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
9b80: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
9b90: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
9ba0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9bb0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
9bc0: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
9bd0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
9be0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
9bf0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
9c00: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
9c10: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74   ClientHello ext
9c20: 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 21  ension */..if (!
9c30: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68  SSL_set_tlsext_h
9c40: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74  ost_name(statePt
9c50: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
9c60: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20  me) && require) 
9c70: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
9c80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9c90: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73  "setting TLS hos
9ca0: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e  t name extension
9cb0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
9cc0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  *) NULL);.      
9cd0: 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28        Tls_Free((
9ce0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
9cf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
9d00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9d10: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a 20  .        }.../* 
9d20: 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 72  Configure server
9d30: 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 6b   host name check
9d40: 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c 69  s in the SSL cli
9d50: 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f 73  ent. Set DNS hos
9d60: 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 6d  tname to..   nam
9d70: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69  e for peer certi
9d80: 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 53  ficate checks. S
9d90: 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 73  SL_set1_host has
9da0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f   limitations. */
9db0: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f  ..if (!SSL_add1_
9dc0: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73  host(statePtr->s
9dd0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29  sl, servername))
9de0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
9df0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9e00: 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f   "setting DNS ho
9e10: 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c  st name failed",
9e20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73  .            Tls
9e40: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
9e50: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20  tatePtr);.      
9e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9e70: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
9e80: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
9e90: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
9ea0: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
9eb0: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
9ec0: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
9ed0: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
9ee0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
9ef0: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
9f00: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
9f10: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
9f20: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
9f30: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
9f40: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
9f50: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
9f60: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
9f70: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
9f80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9f90: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69  Resume session i
9fa0: 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  d ", session_id,
9fb0: 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61   " failed", (cha
9fc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  r *) NULL);.    
9fd0: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65          Tls_Free
9fe0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
9ff0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
a000: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a010: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
a020: 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a   if (alpn) {../*
a030: 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 6c   Convert a Tcl l
a040: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f  ist into a proto
a050: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65  col-list in wire
a060: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69  -format */..unsi
a070: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
a080: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64  s, *p;..unsigned
a090: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20   int protos_len 
a0a0: 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e  = 0;..int i, len
a0b0: 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20  , cnt;..Tcl_Obj 
a0c0: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
a0d0: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
a0e0: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
a0f0: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  n, &cnt, &list) 
a100: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
a110: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
a120: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a130: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a140: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RROR;..}.../* De
a150: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f  termine the memo
a160: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ry required for 
a170: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
a180: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30  t */..for (i = 0
a190: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
a1a0: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74  {..    Tcl_GetSt
a1b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
a1c0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [i], &len);..   
a1d0: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20   if (len > 255) 
a1e0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
a1f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c  sult(interp, "AL
a200: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65  PN protocol name
a210: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61   too long", (cha
a220: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
a230: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
a240: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
a250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a260: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
a270: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e  s_len += 1 + len
a280: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
a290: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
a2a0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
a2b0: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
a2c0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
a2d0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
a2e0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
a2f0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
a300: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
a310: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70  /..for (i = 0, p
a320: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63   = protos; i < c
a330: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
a340: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
a350: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a360: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
a370: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e  ..    *p++ = len
a380: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
a390: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20   str, len);..   
a3a0: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
a3b0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
a3c0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
a3d0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
a3e0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
a3f0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
a400: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
a410: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
a420: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
a430: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
a440: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
a450: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
a460: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
a470: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a480: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
a490: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72  d to set ALPN pr
a4a0: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20  otocols", (char 
a4b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a4c0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a4d0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a4e0: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b   ckfree(protos);
a4f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a500: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
a510: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20  Store protocols 
a520: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  list */..statePt
a530: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74  r->protos = prot
a540: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  os;..statePtr->p
a550: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74  rotos_len = prot
a560: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
a570: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
a580: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09  protos = NULL;..
a590: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
a5a0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  _len = 0;.    }.
a5b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
a5c0: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20  SL Callbacks.   
a5d0: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74    */.    SSL_set
a5e0: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50  _app_data(stateP
a5f0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
a600: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70  )statePtr);./* p
a610: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20  oint back to us 
a620: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76  */.    SSL_set_v
a630: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e  erify(statePtr->
a640: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72  ssl, verify, Ver
a650: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ifyCallback);.  
a660: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e    SSL_CTX_set_in
a670: 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  fo_callback(stat
a680: 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43  ePtr->ctx, InfoC
a690: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f  allback);..    /
a6a0: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61  * Create Tcl_Cha
a6b0: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72  nnel BIO Handler
a6c0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
a6d0: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  ->p_bio.= BIO_ne
a6e0: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20  w_tcl(statePtr, 
a6f0: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20  BIO_NOCLOSE);.  
a700: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09    statePtr->bio.
a710: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f  = BIO_new(BIO_f_
a720: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20  ssl());..    if 
a730: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53  (server) {../* S
a740: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  erver callbacks 
a750: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
a760: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
a770: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  e_arg(statePtr->
a780: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
a790: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58  tePtr);..SSL_CTX
a7a0: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
a7b0: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28  ername_callback(
a7c0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
a7d0: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53  NICallback);..SS
a7e0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
a7f0: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50  _hello_cb(stateP
a800: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61  tr->ctx, HelloCa
a810: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
a820: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28  statePtr);..if (
a830: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
a840: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
a850: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70   SSL_CTX_set_alp
a860: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
a870: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
a880: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
a890: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64  )statePtr);.#ifd
a8a0: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20  ef USE_NPN..    
a8b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
a8c0: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73  _protos_advertis
a8d0: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ed_cb(statePtr->
a8e0: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b  ctx, NPNCallback
a8f0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
a900: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a  tr);.#endif..}..
a910: 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65  ./* Enable serve
a920: 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72  r to send cert r
a930: 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e  equest after han
a940: 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20  dshake (TLS 1.3 
a950: 6f 6e 6c 79 29 20 2a 2f 0a 09 69 66 20 28 72 65  only) */..if (re
a960: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
a970: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
a980: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e  SSL_verify_clien
a990: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
a9a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
a9b0: 0a 09 7d 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e  ..}...statePtr->
a9c0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
a9d0: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65  _SERVER;..SSL_se
a9e0: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73  t_accept_state(s
a9f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
aa00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
aa10: 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73  Client callbacks
aa20: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74   */..if (statePt
aa30: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
aa40: 4c 29 20 7b 0a 23 69 66 64 65 66 20 55 53 45 5f  L) {.#ifdef USE_
aa50: 4e 50 4e 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  NPN..    SSL_CTX
aa60: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f  _set_next_proto_
aa70: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50  select_cb(stateP
aa80: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c  tr->ctx, ALPNCal
aa90: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
aaa0: 74 61 74 65 50 74 72 29 3b 0a 23 65 6e 64 69 66  tatePtr);.#endif
aab0: 0a 09 7d 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  ..}../* Session 
aac0: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f  caching */..SSL_
aad0: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f  CTX_set_session_
aae0: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65  cache_mode(state
aaf0: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45  Ptr->ctx, SSL_SE
ab00: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20  SS_CACHE_CLIENT 
ab10: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  | SSL_SESS_CACHE
ab20: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f  _NO_INTERNAL_STO
ab30: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  RE);..SSL_CTX_se
ab40: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74  ss_set_new_cb(st
ab50: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73  atePtr->ctx, Ses
ab60: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  sionCallback);..
ab70: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20  ./* Enable post 
ab80: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e  handshake Authen
ab90: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69  tication extensi
aba0: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  on. TLS 1.3 only
abb0: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f  , not http/2. */
abc0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
abd0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
abe0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f   {..    SSL_set_
abf0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61  post_handshake_a
ac00: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uth(statePtr->ss
ac10: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 53 53 4c 5f  l, 1);..}...SSL_
ac20: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74  set_connect_stat
ac30: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
ac40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
ac50: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72  set_bio(statePtr
ac60: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d  ->ssl, statePtr-
ac70: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72  >p_bio, statePtr
ac80: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49  ->p_bio);.    BI
ac90: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
aca0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
acb0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c  r->ssl, BIO_NOCL
acc0: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  OSE);..    /*.  
acd0: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20     * End of SSL 
ace0: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20  Init.     */.   
acf0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
ad00: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  ing %s", Tcl_Get
ad10: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
ad20: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
ad30: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
ad40: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
ad50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ad60: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
ad70: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  lf), TCL_VOLATIL
ad80: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  E);..    return 
ad90: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
ada0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
adb0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
ae00: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
ae10: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
ae20: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
ae30: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
ae40: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
ae50: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
ae60: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
ae70: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
ae80: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
ae90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
aea0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
aeb0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
aec0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
aed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
af10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
af20: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
af30: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
af40: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
af50: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
af60: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
af70: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
af80: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
af90: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
afa0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
afb0: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69  on. */..    dpri
afc0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
afd0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
afe0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
aff0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
b000: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
b010: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
b020: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
b030: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
b040: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
b050: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b060: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
b070: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
b080: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
b090: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
b0a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
b0b0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
b0c0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
b0d0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
b0e0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
b0f0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
b100: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66  l(chan);..    if
b110: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
b120: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
b130: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
b140: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
b150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
b160: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
b170: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
b180: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
b190: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
b1a0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  l", NULL);..retu
b1b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b1c0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c    }..    if (Tcl
b1d0: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28  _UnstackChannel(
b1e0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d  interp, chan) ==
b1f0: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72   TCL_ERROR) {..r
b200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
b220: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
b230: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
b240: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b290: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74  -. *. * CTX_Init
b2a0: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20   -- construct a 
b2b0: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
b2c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
b2d0: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43   *.A valid SSL_C
b2e0: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e  TX instance or N
b2f0: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ULL.. *. * Side 
b300: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
b310: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65  tructs SSL conte
b320: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
b330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b370: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c  -. */.static SSL
b380: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28  _CTX *.CTX_Init(
b390: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
b3a0: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69   int isServer, i
b3b0: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a  nt proto, char *
b3c0: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  keyfile, char *c
b3d0: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73  ertfile,.    uns
b3e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c  igned char *key,
b3f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b400: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65  cert, int key_le
b410: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c  n, int cert_len,
b420: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20   char *CAdir,.  
b430: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20    char *CAfile, 
b440: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
b450: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
b460: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
b470: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a  ar *DHparams) {.
b480: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
b490: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74  interp = statePt
b4a0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53  r->interp;.    S
b4b0: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
b4c0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
b4d0: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f  ing ds;.    Tcl_
b4e0: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20  DString ds1;.   
b4f0: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20   int off = 0;.  
b500: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61    int load_priva
b510: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  te_key;.    cons
b520: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
b530: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
b540: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
b550: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b     if (!proto) {
b560: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b570: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76  lt(interp, "no v
b580: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65  alid protocol se
b590: 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  lected", NULL);.
b5a0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
b5b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
b5c0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
b5d0: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
b5e0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
b5f0: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
b600: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
b610: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
b620: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
b630: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
b640: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
b650: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
b660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b670: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
b680: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
b690: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
b6a0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
b6b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
b6c0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
b6d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
b6e0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
b6f0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
b700: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c  TO_SSL3)) {..Tcl
b710: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b720: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74  terp, "SSL3 prot
b730: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
b740: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
b750: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
b760: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
b770: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
b780: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
b790: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28  O_TLS1).    if (
b7a0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
b7b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20  LS_PROTO_TLS1)) 
b7c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
b7d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
b7e0: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.0 protocol no
b7f0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
b800: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
b810: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
b820: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
b830: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
b840: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
b850: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_1).    if (ENA
b860: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
b870: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b  PROTO_TLS1_1)) {
b880: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
b8a0: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.1 protocol not
b8b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
b8c0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
b8d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
b8e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
b8f0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
b900: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b910: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
b920: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
b930: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
b940: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b950: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
b960: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
b970: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
b980: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
b990: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
b9a0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
b9b0: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
b9c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
b9d0: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
b9e0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
b9f0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09  OTO_TLS1_3)) {..
ba00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ba10: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
ba20: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
ba30: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
ba40: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
ba50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
ba60: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29    switch (proto)
ba70: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
ba80: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
ba90: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
baa0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
bab0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
bac0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
bad0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
bae0: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL2:..method =
baf0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
bb00: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  2_server_method(
bb10: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74  ) : SSLv2_client
bb20: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
bb30: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
bb40: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
bb50: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
bb60: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
bb70: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
bb80: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
bb90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
bba0: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f  OTO_SSL3:..metho
bbb0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53  d = isServer ? S
bbc0: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68  SLv3_server_meth
bbd0: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69  od() : SSLv3_cli
bbe0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
bbf0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
bc00: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
bc10: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
bc20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20  PENSSL_NO_TLS1) 
bc30: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
bc40: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48  SSL_NO_TLS1_METH
bc50: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
bc60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65  _PROTO_TLS1:..me
bc70: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
bc80: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d  ? TLSv1_server_m
bc90: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
bca0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
bcb0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
bcc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
bcd0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
bce0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
bcf0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
bd00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
bd10: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
bd20: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
bd30: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_1:..method 
bd40: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
bd50: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  v1_1_server_meth
bd60: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63  od() : TLSv1_1_c
bd70: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
bd80: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
bd90: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
bda0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
bdb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
bdc0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
bdd0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
bde0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
bdf0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
be00: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_2:..method =
be10: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
be20: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_2_server_metho
be30: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c  d() : TLSv1_2_cl
be40: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
be50: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
be60: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
be70: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
be80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
be90: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c  1_3).    case TL
bea0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a  S_PROTO_TLS1_3:.
beb0: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65  ./* Use the gene
bec0: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63  ric method and c
bed0: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20  onstraint range 
bee0: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73  after context is
bef0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74   created */..met
bf00: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
bf10: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68   TLS_server_meth
bf20: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e  od() : TLS_clien
bf30: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
bf40: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
bf50: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f  efault:../* Nego
bf60: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76  tiate highest av
bf70: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20  ailable SSL/TLS 
bf80: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68  version */..meth
bf90: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
bfa0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
bfb0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
bfc0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f  _method();.#if O
bfd0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
bfe0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
bff0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
c000: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
c010: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c020: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL2)..off |= (E
c030: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
c040: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20  S_PROTO_SSL2)   
c050: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
c060: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv2);.#endif.#
c070: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
c080: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
c090: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
c0a0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
c0b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
c0c0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20  OTO_SSL3)   ? 0 
c0d0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
c0e0: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  3);.#endif.#if !
c0f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
c100: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c110: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f  NSSL_NO_TLS1)..o
c120: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
c130: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
c140: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53  TLS1)   ? 0 : SS
c150: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a  L_OP_NO_TLSv1);.
c160: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
c170: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
c180: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
c190: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f  SL_NO_TLS1_1)..o
c1a0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
c1b0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
c1c0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53  TLS1_1) ? 0 : SS
c1d0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29  L_OP_NO_TLSv1_1)
c1e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
c1f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
c200: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c210: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
c220: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
c230: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
c240: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20  O_TLS1_2) ? 0 : 
c250: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
c260: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
c270: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
c280: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
c290: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
c2a0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
c2b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
c2c0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20  OTO_TLS1_3) ? 0 
c2d0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
c2e0: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72  1_3);.#endif..br
c2f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
c300: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
c310: 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  );.    ctx = SSL
c320: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
c330: 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 29  ;..    if (!ctx)
c340: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29   {..return(NULL)
c350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
c360: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f  (getenv(SSLKEYLO
c370: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43  GFILE)) {..SSL_C
c380: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61  TX_set_keylog_ca
c390: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c  llback(ctx, KeyL
c3a0: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ogCallback);.   
c3b0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
c3c0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
c3d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c3e0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
c3f0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f  f (proto == TLS_
c400: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a  PROTO_TLS1_3) {.
c410: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e  .SSL_CTX_set_min
c420: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
c430: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
c440: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ON);..SSL_CTX_se
c450: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
c460: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
c470: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a  VERSION);.    }.
c480: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46  #endif..    /* F
c490: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65  orce cipher sele
c4a0: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73  ction order by s
c4b0: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  erver */.    if 
c4c0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53  (!isServer) {..S
c4d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
c4e0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43  ns(ctx, SSL_OP_C
c4f0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45  IPHER_SERVER_PRE
c500: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a  FERENCE);.    }.
c510: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c520: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
c530: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
c540: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
c550: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
c560: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
c570: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
c580: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
c590: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
c5a0: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
c5b0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
c5c0: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73  x, off);../* dis
c5d0: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65  able protocol ve
c5e0: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50  rsions */.#if OP
c5f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
c600: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30  MBER < 0x1010100
c610: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  0L.    SSL_CTX_s
c620: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c  et_mode(ctx, SSL
c630: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59  _MODE_AUTO_RETRY
c640: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77  );./* handle new
c650: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62   handshakes in b
c660: 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79  ackground. On by
c670: 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e   default in Open
c680: 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65  SSL 1.1.1. */.#e
c690: 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58  ndif.    SSL_CTX
c6a0: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
c6b0: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a  size(ctx, 128);.
c6c0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72  .    /* Set user
c6d0: 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73   defined ciphers
c6e0: 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c  , cipher suites,
c6f0: 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65   and security le
c700: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  vel */.    if ((
c710: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
c720: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
c730: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
c740: 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 20  , ciphers)) {.. 
c750: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c760: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
c770: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
c780: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
c790: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
c7a0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
c7b0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
c7c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20   return NULL;.  
c7d0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
c7e0: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
c7f0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
c800: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
c810: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
c820: 73 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  s)) {..    Tcl_A
c830: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c840: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20  rp, "Set cipher 
c850: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e  suites failed: N
c860: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22  o valid ciphers"
c870: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c880: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
c890: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
c8a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
c8b0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65  }..    /* Set se
c8c0: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
c8d0: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20      if (level > 
c8e0: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29  -1 && level < 6)
c8f0: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
c900: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f  ecurity_level */
c910: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65  ..SSL_CTX_set_se
c920: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78  curity_level(ctx
c930: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  , level);.    }.
c940: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65  .    /* set some
c950: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20   callbacks */.  
c960: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65    SSL_CTX_set_de
c970: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28  fault_passwd_cb(
c980: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c  ctx, PasswordCal
c990: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f  lback);.    SSL_
c9a0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
c9b0: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61  passwd_cb_userda
c9c0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  ta(ctx, (void *)
c9d0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
c9e0: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65  /* read a Diffie
c9f0: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74  -Hellman paramet
ca00: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65  ers file, or use
ca10: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e   the built-in on
ca20: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e  e */.#ifdef OPEN
ca30: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66  SSL_NO_DH.    if
ca40: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
ca50: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
ca60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ca70: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75  "DH parameter su
ca80: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61  pport not availa
ca90: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ble", (char *) N
caa0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
cab0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
cac0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
cad0: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64  lse.    {..DH* d
cae0: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73  h;..if (DHparams
caf0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
cb00: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20   BIO *bio;..    
cb10: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
cb20: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d  &ds);..    bio =
cb30: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32   BIO_new_file(F2
cb40: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29  N(DHparams, &ds)
cb50: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20  , "r");..    if 
cb60: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44  (!bio) {...Tcl_D
cb70: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
cb80: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
cb90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
cba0: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70  ld not find DH p
cbb0: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c  arameters file",
cbc0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
cbd0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
cbe0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
cbf0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ULL;..    }...  
cc00: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f    dh = PEM_read_
cc10: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f  bio_DHparams(bio
cc20: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
cc30: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72  LL);..    BIO_fr
cc40: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63  ee(bio);..    Tc
cc50: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
cc60: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68  s);..    if (!dh
cc70: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
cc80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cc90: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44  Could not read D
cca0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f  H parameters fro
ccb0: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  m file", (char *
ccc0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
ccd0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
cce0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
ccf0: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20    }..} else {.. 
cd00: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61     dh = get_dhPa
cd10: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f  rams();..}..SSL_
cd20: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63  CTX_set_tmp_dh(c
cd30: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65  tx, dh);..DH_fre
cd40: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e(dh);.    }.#en
cd50: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20  dif..    /* set 
cd60: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20  our certificate 
cd70: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76  */.    load_priv
cd80: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20  ate_key = 0;.   
cd90: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d   if (certfile !=
cda0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
cdb0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
cdc0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  ..Tcl_DStringIni
cdd0: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53  t(&ds);...if (SS
cde0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
cdf0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
ce00: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64  F2N(certfile, &d
ce10: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
ce20: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20  _PEM) <= 0) {.. 
ce30: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
ce40: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
ce50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ce60: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
ce70: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74  o set certificat
ce80: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
ce90: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20  le, ": ",....   
cea0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
ceb0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
cec0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
ced0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
cee0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  NULL;..}.    } e
cef0: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20  lse if (cert != 
cf00: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
cf10: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09  ivate_key = 1;..
cf20: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
cf30: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31  certificate_ASN1
cf40: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20  (ctx, cert_len, 
cf50: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20  cert) <= 0) {.. 
cf60: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
cf70: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
cf80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cf90: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
cfa0: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74  o set certificat
cfb0: 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45  e: ",....     RE
cfc0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
cfd0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
cfe0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
cff0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
d000: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
d010: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63  {..certfile = (c
d020: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65  har*)X509_get_de
d030: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28  fault_cert_file(
d040: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
d050: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
d060: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66  _file(ctx, certf
d070: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ile, SSL_FILETYP
d080: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23  E_PEM) <= 0) {.#
d090: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53  if 0..    Tcl_DS
d0a0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
d0b0: 09 20 20 20 20 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 75  esult(interp, "u
d0d0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66  nable to use def
d0e0: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65  ault certificate
d0f0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
d100: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20  e, ": ",....    
d110: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
d120: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
d130: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d140: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
d150: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20  ULL;.#endif..}. 
d160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74     }..    /* set
d170: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79   our private key
d180: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64   */.    if (load
d190: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a  _private_key) {.
d1a0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20  .if (keyfile == 
d1b0: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e  NULL && key == N
d1c0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66  ULL) {..    keyf
d1d0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
d1e0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  .}...if (keyfile
d1f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
d200: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76   /* get the priv
d210: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  ate key associat
d220: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72  ed with this cer
d230: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
d240: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20   if (keyfile == 
d250: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c  NULL) {...keyfil
d260: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20  e = certfile;.. 
d270: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53     }...    if (S
d280: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
d290: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20  teKey_file(ctx, 
d2a0: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73  F2N(keyfile, &ds
d2b0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
d2c0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  PEM) <= 0) {...T
d2d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d2e0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
d2f0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
d300: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
d310: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
d320: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
d330: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
d340: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
d350: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d360: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
d370: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
d380: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66  key file ", keyf
d390: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20  ile, " ",....   
d3a0: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20        REASON(), 
d3b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d3c0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
d3d0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
d3e0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
d3f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d400: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69  &ds);...} else i
d410: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20  f (key != NULL) 
d420: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  {..    if (SSL_C
d430: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
d440: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f  y_ASN1(EVP_PKEY_
d450: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65  RSA, ctx, key,ke
d460: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09  y_len) <= 0) {..
d470: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
d480: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
d490: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
d4a0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
d4b0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
d4c0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
d4d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
d4e0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
d4f0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
d500: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
d510: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
d520: 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e  c key: ", REASON
d530: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
d540: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
d550: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
d560: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
d570: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f  }../* Now we kno
d580: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64  w that a key and
d590: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20   cert have been 
d5a0: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20  set against.. * 
d5b0: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  the SSL context 
d5c0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58  */..if (!SSL_CTX
d5d0: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b  _check_private_k
d5e0: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20  ey(ctx)) {..    
d5f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d600: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74  (interp, "privat
d610: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  e key does not m
d620: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69  atch the certifi
d630: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22  cate public key"
d640: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20  ,....     (char 
d650: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
d660: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
d670: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
d680: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  LL;..}.    }..  
d690: 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63    /* Set verific
d6a0: 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20  ation CAs */.   
d6b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
d6c0: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  (&ds);.    Tcl_D
d6d0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29  StringInit(&ds1)
d6e0: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ;.    if (!SSL_C
d6f0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
d700: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
d710: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
d720: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29  F2N(CAdir, &ds1)
d730: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73  ) ||..!SSL_CTX_s
d740: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
d750: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a  y_paths(ctx)) {.
d760: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69  #if 0..Tcl_DStri
d770: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63  ngFree(&ds);..Tc
d780: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
d790: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63  s1);../* Don't c
d7a0: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66  urrently care if
d7b0: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09   this fails */..
d7c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d7d0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65  (interp, "SSL de
d7e0: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74  fault verify pat
d7f0: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  hs: ", REASON(),
d800: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d810: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
d820: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
d830: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  L;.#endif.    }.
d840: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f  .    /* https://
d850: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
d860: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a  p/tls/bugs/57/ *
d870: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  /.    /* XXX:TOD
d880: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
d890: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
d8a0: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
d8b0: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
d8c0: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
d8d0: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20  ystem */.    if 
d8e0: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  (CAfile != NULL)
d8f0: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30   {..STACK_OF(X50
d900: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
d910: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
d920: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
d930: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
d940: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21  .if (certNames !
d950: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
d960: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
d970: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
d980: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20  ertNames);..}.  
d990: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
d9a0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20  ringFree(&ds);. 
d9b0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
d9c0: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65  ee(&ds1);.    re
d9d0: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a  turn ctx;.}.../*
d9e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
d9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da20: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61  ------. *. * Sta
da30: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  tusObjCmd -- ret
da40: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20  urn certificate 
da50: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65  for connected pe
da60: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
da70: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
da80: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
da90: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
daa0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
dab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
daf0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
db00: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43  t.StatusObjCmd(C
db10: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
db20: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
db30: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
db40: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
db50: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
db60: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
db70: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72  ;.    X509 *peer
db80: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
db90: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43  bjPtr;.    Tcl_C
dba0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
dbb0: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61   char *channelNa
dbc0: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20  me, *ciphers;.  
dbd0: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
dbe0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
dbf0: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
dc00: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
dc10: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a  ;.    int nid;..
dc20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
dc30: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74  led");..    swit
dc40: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73  ch (objc) {..cas
dc50: 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65  e 2:..    channe
dc60: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
dc70: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
dc80: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  v[1], NULL);..  
dc90: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
dca0: 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72  3:..    if (!str
dcb0: 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69  cmp (Tcl_GetStri
dcc0: 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d  ng (objv[1]), "-
dcd0: 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61  local")) {...cha
dce0: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  nnelName = Tcl_G
dcf0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
dd00: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a  objv[2], NULL);.
dd10: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a  ..break;..    }.
dd20: 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c  .    /* else fal
dd30: 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f  l-through ... */
dd40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47  .#if defined(__G
dd50: 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74  NUC__)..    __at
dd60: 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74  tribute__((fallt
dd70: 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66  hrough));.#endif
dd80: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20  ..default:..    
dd90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
dda0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
ddb0: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
ddc0: 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75  nel");..    retu
ddd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dde0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
ddf0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
de00: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61  nterp, channelNa
de10: 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20  me, &mode);.    
de20: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
de30: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
de40: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
de50: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ROR;.    }.    /
de60: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
de70: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
de80: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
de90: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
dea0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
deb0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
dec0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
ded0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
dee0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
def0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
df00: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
df10: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
df20: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
df30: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
df40: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
df50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
df60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
df70: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
df80: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43  tate *) Tcl_GetC
df90: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
dfa0: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  ta(chan);.    if
dfb0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
dfc0: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
dfd0: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
dfe0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
dff0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
e000: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
e010: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
e020: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
e030: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09     if (peer) {..
e040: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77  objPtr = Tls_New
e050: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
e060: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63  peer);..if (objc
e070: 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72   == 2) { X509_fr
e080: 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20  ee(peer); }.    
e090: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72  } else {..objPtr
e0a0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
e0b0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
e0c0: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63  }..    /* Peer c
e0d0: 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e  ert chain (clien
e0e0: 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53  t only) */.    S
e0f0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73  TACK_OF(X509)* s
e100: 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67  sl_certs = SSL_g
e110: 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61  et_peer_cert_cha
e120: 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  in(statePtr->ssl
e130: 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72  );.    if (!peer
e140: 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d   && (ssl_certs =
e150: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30  = NULL || sk_X50
e160: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29  9_num(ssl_certs)
e170: 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72   == 0)) {..retur
e180: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e190: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20   }..    /* Peer 
e1a0: 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a  name from cert *
e1b0: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
e1c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
e1d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
e1e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e1f0: 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29  "peername", -1))
e200: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
e210: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
e220: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
e230: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e240: 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d  SSL_get0_peernam
e250: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
e260: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
e270: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e280: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e290: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e2a0: 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20  ingObj("sbits", 
e2b0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
e2c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e2d0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e2e0: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
e2f0: 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f  (SSL_get_cipher_
e300: 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73  bits(statePtr->s
e310: 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20  sl, NULL)));..  
e320: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
e330: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
e340: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
e350: 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  ;.    if ((ciphe
e360: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28  rs != NULL) && (
e370: 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20  strcmp(ciphers, 
e380: 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29  "(NONE)") != 0))
e390: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
e3a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
e3b0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e3c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
e3d0: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  ipher", -1));..T
e3e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e3f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e400: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e410: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
e420: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
e430: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20  ->ssl), -1));.  
e440: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69    }..    /* Veri
e450: 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74  fy the X509 cert
e460: 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65  ificate presente
e470: 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f  d by the peer */
e480: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
e490: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
e4a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
e4b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
e4c0: 76 65 72 69 66 69 63 61 74 69 6f 6e 22 2c 20 2d  verification", -
e4d0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
e4e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
e4f0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
e500: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
e510: 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f  Obj(X509_verify_
e520: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
e530: 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  g(SSL_get_verify
e540: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
e550: 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a  ->ssl)), -1));..
e560: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68      /* Report th
e570: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
e580: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
e590: 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69  of the negotiati
e5a0: 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65  on */.    SSL_ge
e5b0: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
e5c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
e5d0: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20  &proto, &len);. 
e5e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
e5f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e600: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e610: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
e620: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
e630: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e640: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e650: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e660: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
e670: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65  )proto, (int) le
e680: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  n));.    Tcl_Lis
e690: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
e6a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
e6b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
e6c0: 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d  bj("protocol", -
e6d0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
e6e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
e6f0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
e700: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
e710: 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  bj(SSL_get_versi
e720: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
e730: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a  ), -1));..    /*
e740: 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52   Valid for non-R
e750: 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64  SA signature and
e760: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
e770: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e780: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e790: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
e7a0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61  StringObj("signa
e7b0: 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68  tureHashAlgorith
e7c0: 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  m", -1));.    if
e7d0: 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53   (objc == 2 ? SS
e7e0: 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
e7f0: 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
e800: 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20  r->ssl, &nid) : 
e810: 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
e820: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
e830: 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54  ssl, &nid)) {..T
e840: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e850: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e860: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e870: 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64  tringObj(OBJ_nid
e880: 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a  2ln(nid), -1));.
e890: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
e8a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e8b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
e8c0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
e8d0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29  ringObj("", -1))
e8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
e8f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e900: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e910: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e920: 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65  ngObj("signature
e930: 5f 74 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20  _type", -1));.  
e940: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20    if (objc == 2 
e950: 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73  ? SSL_get_peer_s
e960: 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
e970: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
e980: 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74   &nid) : SSL_get
e990: 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f  _signature_type_
e9a0: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
e9b0: 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c  l, &nid)) {..Tcl
e9c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e9d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e9e0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e9f0: 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c  ingObj(OBJ_nid2l
ea00: 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20  n(nid), -1));.  
ea10: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
ea20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ea30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ea40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
ea50: 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a  ngObj("", -1));.
ea60: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
ea70: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ea80: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
ea90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
eaa0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
eab0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
eac0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
ead0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e  ------. *. * Con
eb10: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d  nectionInfoObjCm
eb20: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e  d -- return conn
eb30: 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d  ection info from
eb40: 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20   OpenSSL.. *. * 
eb50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69  Results:. *.A li
eb60: 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  st of connection
eb70: 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d   info.  *. *----
eb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ebc0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20   */..static int 
ebd0: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62  ConnectionInfoOb
ebe0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
ebf0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
ec00: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ec10: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
ec20: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
ec30: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
ec40: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
ec50: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
ec60: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
ec70: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
ec80: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
ec90: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
eca0: 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  et */.    Tcl_Ob
ecb0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63  j *objPtr;.    c
ecc0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20  onst SSL *ssl;. 
ecd0: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50     const SSL_CIP
ece0: 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20  HER *cipher;.   
ecf0: 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49   const SSL_SESSI
ed00: 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20  ON *session;.   
ed10: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
ed20: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
ed30: 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20   long mode;..   
ed40: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
ed50: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
ed60: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
ed70: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
ed80: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
ed90: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
eda0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
edb0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
edc0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
edd0: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c  bj(objv[1], NULL
ede0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
edf0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
ee00: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
ee10: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
ee20: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  R);.    }..    /
ee30: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
ee40: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
ee50: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
ee60: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ee70: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
ee80: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
ee90: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
eea0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
eeb0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
eec0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
eed0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
eee0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
eef0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
ef00: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54  n), "\": not a T
ef10: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
ef20: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  L);..return(TCL_
ef30: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
ef40: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
ef50: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
ef60: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
ef70: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
ef80: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
ef90: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
efa0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
efb0: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
efc0: 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
efd0: 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
efe0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f  = NULL) {../* co
eff0: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a  nnection state *
f000: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
f010: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f020: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74  NewStringObj("st
f040: 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ate", -1));..Tcl
f050: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f060: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
f070: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f080: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65  ingObj(SSL_state
f090: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
f0a0: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65  ), -1));.../* Ge
f0b0: 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20  t SNI requested 
f0c0: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  server name */..
f0d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f0e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f0f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f100: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65  StringObj("serve
f110: 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54  rname", -1));..T
f120: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f130: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f140: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
f150: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
f160: 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
f170: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
f180: 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29  _host_name), -1)
f190: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74  );.../* Get prot
f1a0: 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  ocol */..Tcl_Lis
f1b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f1c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
f1d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f1e0: 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d  bj("protocol", -
f1f0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f200: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f210: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f220: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f230: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
f240: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a  ssl), -1));.../*
f250: 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61   Renegotiation a
f260: 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c  llowed */..Tcl_L
f270: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f280: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f290: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f2a0: 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74  gObj("renegotiat
f2b0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ion", -1));..Tcl
f2c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f2d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
f2e0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f2f0: 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c  ingObj(..    SSL
f300: 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65  _get_secure_rene
f310: 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72  gotiation_suppor
f320: 74 28 73 73 6c 29 20 3f 20 22 73 75 70 70 6f 72  t(ssl) ? "suppor
f330: 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70  ted" : "not supp
f340: 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09  orted", -1));...
f350: 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20  /* Get security 
f360: 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69  level */..Tcl_Li
f370: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f380: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
f390: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f3a0: 4f 62 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76  Obj("securitylev
f3b0: 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  el", -1));..Tcl_
f3c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f3d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
f3e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
f3f0: 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 72  bj(SSL_get_secur
f400: 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29  ity_level(ssl)))
f410: 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69  ;.../* Session i
f420: 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  nfo */..Tcl_List
f430: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f440: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f450: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f460: 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  j("session_reuse
f470: 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  d", -1));..Tcl_L
f480: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f490: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f4a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
f4b0: 61 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f  anObj(SSL_sessio
f4c0: 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b  n_reused(ssl)));
f4d0: 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20  .../* Is server 
f4e0: 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  info */..Tcl_Lis
f4f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f500: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
f510: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f520: 62 6a 28 22 69 73 5f 73 65 72 76 65 72 22 2c 20  bj("is_server", 
f530: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
f540: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f550: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f560: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
f570: 6a 28 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28  j(SSL_is_server(
f580: 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ssl)));.    }.. 
f590: 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66     /* Cipher inf
f5a0: 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20  o */.    cipher 
f5b0: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
f5c0: 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20  t_cipher(ssl);. 
f5d0: 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d     if (cipher !=
f5e0: 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
f5f0: 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d  uf[BUFSIZ] = {0}
f600: 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67  ;..int bits, alg
f610: 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73  _bits;...Tcl_Lis
f620: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f630: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
f640: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f650: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29  bj("cipher", -1)
f660: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
f670: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f680: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
f690: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
f6a0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
f6b0: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b  e(cipher), -1));
f6c0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f6d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f6e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f6f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61  ewStringObj("sta
f700: 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29  ndard_name", -1)
f710: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
f720: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f730: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
f740: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
f750: 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
f760: 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  d_name(cipher), 
f770: 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53  -1));...bits = S
f780: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
f790: 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
f7a0: 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  bits);..Tcl_List
f7b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f7c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f7d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f7e0: 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  j("bits", -1));.
f7f0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f800: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f810: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f820: 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a  wIntObj(bits));.
f830: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f840: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f850: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f860: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72  wStringObj("secr
f870: 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  et_bits", -1));.
f880: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f890: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f8a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f8b0: 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73  wIntObj(alg_bits
f8c0: 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  ));../* alg_bits
f8d0: 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
f8e0: 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
f8f0: 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
f900: 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
f910: 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20  its differ,.    
f920: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 74 20         the rest 
f930: 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20  of the bits are 
f940: 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20  fixed, i.e. for 
f950: 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63  limited export c
f960: 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35  iphers (bits < 5
f970: 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  6) */..Tcl_ListO
f980: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f990: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f9a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f9b0: 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20  ("min_version", 
f9c0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
f9d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f9e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f9f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
fa00: 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
fa10: 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c  version(cipher),
fa20: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20   -1));.../* Get 
fa30: 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
fa40: 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
fa50: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
fa60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fa70: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
fa80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
fa90: 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  id", -1));..Tcl_
faa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
fad0: 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  bj((int) SSL_CIP
fae0: 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65  HER_get_id(ciphe
faf0: 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  r)));...if (SSL_
fb00: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69  CIPHER_descripti
fb10: 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20  on(cipher, buf, 
fb20: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20  sizeof(buf)) != 
fb30: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
fb40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fb50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fb60: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fb70: 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74  ingObj("descript
fb80: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20  ion", -1));..   
fb90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fba0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fbb0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fbc0: 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
fbd0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  -1));..}.    }..
fbe0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
fbf0: 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
fc00: 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
fc10: 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
fc20: 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
fc30: 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
fc40: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
fc50: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
fc60: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
fc70: 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
fc80: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
fc90: 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 75  ion_id;..char bu
fca0: 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53  ffer[SSL_MAX_MAS
fcb0: 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b  TER_KEY_LENGTH];
fcc0: 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
fcd0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
fce0: 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
fcf0: 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74  f the ALPN negot
fd00: 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53  iation */..SSL_S
fd10: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e  ESSION_get0_alpn
fd20: 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f  _selected(sessio
fd30: 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32  n, &proto, &len2
fd40: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
fd50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fd60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fd70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61  _NewStringObj("a
fd80: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  lpn", -1));..Tcl
fd90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fda0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fdb0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fdc0: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70  ingObj((char *)p
fdd0: 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32  roto, (int) len2
fde0: 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  ));.../* Report 
fdf0: 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
fe00: 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
fe10: 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67  t of the NPN neg
fe20: 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64  otiation */.#ifd
fe30: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f  ef USE_NPN..SSL_
fe40: 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f  get0_next_proto_
fe50: 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20  negotiated(ssl, 
fe60: 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a  &proto, &ulen);.
fe70: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
fe80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fe90: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fea0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e 22  wStringObj("npn"
feb0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fec0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fed0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fee0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fef0: 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  bj((char *)proto
ff00: 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a  , (int) ulen));.
ff10: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75  #endif.../* Resu
ff20: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f  mable session */
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 72 65 73  ewStringObj("res
ff70: 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09  umable", -1));..
ff80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ff90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
ffa0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
ffb0: 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49  IntObj(SSL_SESSI
ffc0: 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28  ON_is_resumable(
ffd0: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a  session)));.../*
ffe0: 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74   Session start t
fff0: 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e  ime (seconds sin
10000 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63  ce epoch) */..Tc
10010 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10020 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10030 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10040 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74  ringObj("start_t
10050 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ime", -1));..Tcl
10060 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10070 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10080 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  jPtr, Tcl_NewLon
10090 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  gObj(SSL_SESSION
100a0 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f  _get_time(sessio
100b0 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f  n)));.../* Timeo
100c0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43  ut value - SSL_C
100d0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28  TX_get_timeout (
100e0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
100f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10100 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10110 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10120 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f  StringObj("timeo
10130 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ut", -1));..Tcl_
10140 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10150 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10160 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67  Ptr, Tcl_NewLong
10170 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  Obj(SSL_SESSION_
10180 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73  get_timeout(sess
10190 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  ion)));.../* Ses
101a0 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
101b0 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
101c0 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c  conds) */..Tcl_L
101d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
101e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
101f0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10200 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c  gObj("lifetime",
10210 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
10220 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10230 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10240 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28   Tcl_NewLongObj(
10250 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
10260 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
10270 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
10280 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64  .../* Session id
10290 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20   */..session_id 
102a0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
102b0 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75  t_id(session, &u
102c0 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  len);..Tcl_ListO
102d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
102e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
102f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10300 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d  ("session_id", -
10310 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
10320 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10330 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10340 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
10350 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  bj(session_id, (
10360 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f  int) ulen));.../
10370 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
10380 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
10390 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
103a0 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
103b0 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
103c0 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  n2);..Tcl_ListOb
103d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
103e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
103f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10400 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22  "session_ticket"
10410 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
10420 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10430 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10440 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
10450 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69  ayObj(ticket, (i
10460 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a  nt) len2));.../*
10470 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61   Ticket app data
10480 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
10490 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70  _get0_ticket_app
104a0 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74  data(session, &t
104b0 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09  icket, &len2);..
104c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
104d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
104e0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
104f0 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65  StringObj("ticke
10500 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29  t_app_data", -1)
10510 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10520 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10530 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10540 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
10550 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c  (ticket, (int) l
10560 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  en2));.../* Get 
10570 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c  master key */..l
10580 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  en2 = SSL_SESSIO
10590 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79  N_get_master_key
105a0 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72  (session, buffer
105b0 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52  , SSL_MAX_MASTER
105c0 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54  _KEY_LENGTH);..T
105d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
105e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
105f0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10600 74 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72  tringObj("master
10610 5f 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63  _key", -1));..Tc
10620 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10630 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10640 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  bjPtr, Tcl_NewBy
10650 74 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65  teArrayObj(buffe
10660 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b  r, (int) len2));
10670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10680 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20  ompression info 
10690 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  */.    if (ssl !
106a0 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66  = NULL) {.#ifdef
106b0 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45   HAVE_SSL_COMPRE
106c0 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d  SSION..const COM
106d0 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20  P_METHOD *comp, 
106e0 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53  *expn;..comp = S
106f0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
10700 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b  ompression(ssl);
10710 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74  ..expn = SSL_get
10720 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69  _current_expansi
10730 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c  on(ssl);...Tcl_L
10740 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10750 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10760 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10770 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f  gObj("compressio
10780 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
10790 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
107a0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
107b0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
107c0 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f  gObj(comp ? SSL_
107d0 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f  COMP_get_name(co
107e0 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31  mp) : "NONE", -1
107f0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
10800 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10810 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10820 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10830 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29  expansion", -1))
10840 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
10850 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10860 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10870 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70  NewStringObj(exp
10880 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  n ? SSL_COMP_get
10890 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e  _name(expn) : "N
108a0 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73  ONE", -1));.#els
108b0 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  e..Tcl_ListObjAp
108c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
108d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
108e0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f  NewStringObj("co
108f0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  mpression", -1))
10900 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
10910 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10920 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10930 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f  NewStringObj("NO
10940 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  NE", -1));..Tcl_
10950 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10960 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10970 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10980 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e  ngObj("expansion
10990 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
109a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
109b0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
109c0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
109d0 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29  Obj("NONE", -1))
109e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
109f0 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e      /* Server in
10a00 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  fo */.    mode =
10a10 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73   SSL_CTX_get_ses
10a20 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
10a30 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
10a40 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53      if (mode & S
10a50 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46  SL_SESS_CACHE_OF
10a60 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f  F) {..proto = "o
10a70 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ff";.    } else 
10a80 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
10a90 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54  ESS_CACHE_CLIENT
10aa0 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c  ) {..proto = "cl
10ab0 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73  ient";.    } els
10ac0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
10ad0 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56  _SESS_CACHE_SERV
10ae0 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22  ER) {..proto = "
10af0 73 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65  server";.    } e
10b00 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
10b10 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
10b20 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22  TH) {..proto = "
10b30 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73  both";.    } els
10b40 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e  e {..proto = "un
10b50 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20  known";.    }.  
10b60 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10b70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10b80 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10b90 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
10ba0 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22  sion_cache_mode"
10bb0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
10bc0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10bd0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10be0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10bf0 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29  ngObj(proto, -1)
10c00 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
10c10 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10c20 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
10c30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
10c40 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
10c50 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ca0 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f  ---. *. * Versio
10cb0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  nObjCmd -- retur
10cc0 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  n version string
10cd0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
10ce0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10cf0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
10d00 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
10d10 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
10d20 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
10d80 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  sionObjCmd(Clien
10d90 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
10da0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
10db0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
10dc0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
10dd0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
10de0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
10df0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
10e00 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
10e10 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
10e20 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
10e30 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
10e40 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
10e50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
10e60 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  Ptr);..    retur
10e70 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
10e80 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
10e90 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63  ta;..objc = objc
10ea0 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a  ;..objv = objv;.
10eb0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
10ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
10f00 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d   * MiscObjCmd --
10f10 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20   misc commands. 
10f20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10f30 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
10f40 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
10f50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
10f60 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
10f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73  /.static int.Mis
10fc0 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  cObjCmd(ClientDa
10fd0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
10fe0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10ff0 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
11000 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
11010 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  []) {.    static
11020 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d   const char *com
11030 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65  mands [] = { "re
11040 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55  q", "strreq", NU
11050 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63  LL };.    enum c
11060 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20  ommand { C_REQ, 
11070 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d  C_STRREQ, C_DUMM
11080 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64  Y };.    int cmd
11090 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  , isStr;.    cha
110a0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
110b0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
110c0 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
110d0 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
110e0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
110f0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11100 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72   "subcommand ?ar
11110 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  gs?");..return T
11120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11130 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
11140 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
11150 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d  rp, objv[1], com
11160 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22  mands, "command"
11170 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c  , 0,&cmd) != TCL
11180 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
11190 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
111a0 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
111b0 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
111c0 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
111d0 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
111e0 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
111f0 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
11200 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
11210 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
11220 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
11230 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
11240 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
11250 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
11260 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63  ;..    int listc
11270 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f  ,i;...    BIO *o
11280 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63  ut=NULL;...    c
11290 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53  har *k_C="",*k_S
112a0 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f  T="",*k_L="",*k_
112b0 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b  O="",*k_OU="",*k
112c0 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d  _CN="",*k_Email=
112d0 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  "";..    char *k
112e0 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73  eyout,*pemout,*s
112f0 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79  tr;..    int key
11300 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61  size,serial=0,da
11310 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45  ys=365;..#if OPE
11320 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
11330 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
11340 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62  L..    BIGNUM *b
11350 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ne = NULL;..    
11360 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b  RSA *rsa = NULL;
11370 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f  .#else..    EVP_
11380 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20  PKEY_CTX *ctx = 
11390 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20  NULL;.#endif... 
113a0 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20     if ((objc<5) 
113b0 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09  || (objc>6)) {..
113c0 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
113d0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
113e0 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66  v, "keysize keyf
113f0 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e  ile certfile ?in
11400 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20  fo?");...return 
11410 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
11420 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f  }...    if (Tcl_
11430 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
11440 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
11450 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f  keysize) != TCL_
11460 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54  OK) {...return T
11470 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
11480 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c  ..    keyout=Tcl
11490 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
114a0 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74  3]);..    pemout
114b0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
114c0 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66  bjv[4]);..    if
114d0 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c   (isStr) {...Tcl
114e0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b  _SetVar(interp,k
114f0 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54  eyout,"",0);...T
11500 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
11510 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,pemout,"",0);..
11520 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
11530 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20  objc>=6) {...if 
11540 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45  (Tcl_ListObjGetE
11550 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
11560 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73  objv[5],....&lis
11570 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54  tc, &listv) != T
11580 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72  CL_OK) {...    r
11590 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
115a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73  ...}....if ((lis
115b0 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09  tc%2) != 0) {...
115c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
115d0 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d  t(interp,"Inform
115e0 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20  ation list must 
115f0 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72  have even number
11600 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e   of arguments",N
11610 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
11620 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
11630 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  }...for (i=0; i<
11640 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09  listc; i+=2) {..
11650 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74  .    str=Tcl_Get
11660 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29  String(listv[i])
11670 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ;...    if (strc
11680 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d  mp(str,"days")==
11690 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
116a0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
116b0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
116c0 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a  &days)!=TCL_OK).
116d0 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
116e0 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
116f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
11700 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d  (str,"serial")==
11710 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
11720 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
11730 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
11740 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b  &serial)!=TCL_OK
11750 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
11760 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
11770 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
11780 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20  mp(str,"C")==0) 
11790 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74  {....k_C=Tcl_Get
117a0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
117b0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
117c0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
117d0 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "ST")==0) {....k
117e0 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _ST=Tcl_GetStrin
117f0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
11800 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
11810 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d  strcmp(str,"L")=
11820 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c  =0) {....k_L=Tcl
11830 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11840 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11850 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
11860 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09  str,"O")==0) {..
11870 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_O=Tcl_GetStr
11880 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
11890 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
118a0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55   (strcmp(str,"OU
118b0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55  ")==0) {....k_OU
118c0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
118d0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
118e0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
118f0 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30  cmp(str,"CN")==0
11900 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f  ) {....k_CN=Tcl_
11910 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
11920 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
11930 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
11940 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20  tr,"Email")==0) 
11950 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c  {....k_Email=Tcl
11960 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11970 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11980 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65  else {....Tcl_Se
11990 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
119a0 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65  Unknown paramete
119b0 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74  r",NULL);....ret
119c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
119d0 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
119e0 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
119f0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
11a00 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
11a10 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b   bne = BN_new();
11a20 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f  ..    rsa = RSA_
11a30 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79  new();..    pkey
11a40 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28   = EVP_PKEY_new(
11a50 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20  );..    if (bne 
11a60 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d  == NULL || rsa =
11a70 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d  = NULL || pkey =
11a80 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65  = NULL || !BN_se
11a90 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46  t_word(bne,RSA_F
11aa0 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e  4) ||...!RSA_gen
11ab0 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61  erate_key_ex(rsa
11ac0 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20  , keysize, bne, 
11ad0 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b  NULL) || !EVP_PK
11ae0 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b  EY_assign_RSA(pk
11af0 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56  ey, rsa)) {...EV
11b00 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
11b10 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65  );.../* RSA_free
11b20 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20  (rsa); freed by 
11b30 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f  EVP_PKEY_free */
11b40 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
11b50 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79  .#else..    pkey
11b60 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28   = EVP_RSA_gen((
11b70 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65  unsigned int) ke
11b80 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78  ysize);..    ctx
11b90 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
11ba0 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a  new(pkey,NULL);.
11bb0 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d  .    if (pkey ==
11bc0 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20   NULL || ctx == 
11bd0 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45  NULL || !EVP_PKE
11be0 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74  Y_keygen_init(ct
11bf0 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45  x) ||...!EVP_PKE
11c00 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65  Y_CTX_set_rsa_ke
11c10 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b  ygen_bits(ctx, k
11c20 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f  eysize) || !EVP_
11c30 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c  PKEY_keygen(ctx,
11c40 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50   &pkey)) {...EVP
11c50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
11c60 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58  ;...EVP_PKEY_CTX
11c70 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64  _free(ctx);.#end
11c80 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  if...Tcl_SetResu
11c90 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
11ca0 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
11cb0 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
11cc0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
11cd0 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
11ce0 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  {...if (isStr) {
11cf0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
11d00 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
11d10 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
11d20 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
11d30 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
11d40 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
11d50 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
11d60 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
11d70 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
11d80 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
11d90 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
11da0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
11db0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
11dc0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66  terp,keyout,buff
11dd0 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
11de0 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
11df0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
11e00 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
11e10 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
11e20 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
11e30 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
11e40 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75  lename(out,keyou
11e50 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
11e60 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
11e70 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
11e80 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
11e90 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d  L);...    /* PEM
11ea0 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72  _write_bio_RSAPr
11eb0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73  ivateKey(out, rs
11ec0 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  a, NULL, NULL, 0
11ed0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a  , NULL, NULL); *
11ee0 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  /...    BIO_free
11ef0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a  _all(out);.. .}.
11f00 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30  ...if ((cert=X50
11f10 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20  9_new())==NULL) 
11f20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
11f30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
11f40 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ror generating c
11f50 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65  ertificate reque
11f60 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  st",NULL);...   
11f70 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
11f80 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
11f90 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
11fa0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
11fb0 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
11fc0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
11fd0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
11fe0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73  );...}....X509_s
11ff0 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c  et_version(cert,
12000 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47  2);...ASN1_INTEG
12010 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f  ER_set(X509_get_
12020 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72  serialNumber(cer
12030 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35  t),serial);...X5
12040 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
12050 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72  09_getm_notBefor
12060 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35  e(cert),0);...X5
12070 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
12080 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72  09_getm_notAfter
12090 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
120a0 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
120b0 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
120c0 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
120d0 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
120e0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
120f0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12100 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12110 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
12120 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12130 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12140 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  C, -1, -1, 0);..
12150 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
12160 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
12170 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"ST", MBSTRING_
12180 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
12190 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53  gned char *) k_S
121a0 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  T, -1, -1, 0);..
121b0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
121c0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
121d0 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"L", MBSTRING_A
121e0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
121f0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
12200 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12210 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12220 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12230 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
12240 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
12250 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d  d char *) k_O, -
12260 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
12270 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12280 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55  _by_txt(name,"OU
12290 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
122a0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
122b0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d   char *) k_OU, -
122c0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
122d0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
122e0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e  _by_txt(name,"CN
122f0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
12300 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
12310 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
12320 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
12330 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12340 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
12350 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
12360 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
12370 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d  ned char *) k_Em
12380 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  ail, -1, -1, 0);
12390 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62  ....X509_set_sub
123a0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e  ject_name(cert,n
123b0 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35  ame);....if (!X5
123c0 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65  09_sign(cert,pke
123d0 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29  y,EVP_sha256()))
123e0 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
123f0 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
12400 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
12410 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
12420 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
12430 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
12440 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
12450 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54  ;.#endif...    T
12460 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
12470 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
12480 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
12490 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
124a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
124b0 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29  .}....if (isStr)
124c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
124d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
124e0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
124f0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
12500 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42  cert);...    i=B
12510 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
12520 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
12530 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
12540 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
12550 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
12560 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
12570 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
12580 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
12590 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
125a0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
125b0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
125c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
125d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
125e0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
125f0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
12600 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,pemout);...    
12610 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
12620 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
12630 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
12640 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  (out);...}....X5
12650 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
12660 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
12670 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
12680 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
12690 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
126a0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
126b0 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a  endif..    }..}.
126c0 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
126d0 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
126e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
126f0 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
12700 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
12710 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e  *********/./* In
12730 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  it             *
12740 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
12750 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
127b0 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
127c0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
127d0 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
127e0 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
127f0 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
12800 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
12810 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
12820 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
12830 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
12840 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
12850 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
12860 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
12870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128b0 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
128c0 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50  ree(char *blockP
128d0 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  tr) {.    State 
128e0 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
128f0 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a  te *)blockPtr;..
12900 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
12910 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  led");..    Tls_
12920 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
12930 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63  .    ckfree(bloc
12940 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  kPtr);.}.../*. *
12950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12990 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c  ---. *. * Tls_Cl
129a0 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ean --. *. *.Thi
129b0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
129c0 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
129d0 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
129e0 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
129f0 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
12a00 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
12a10 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20   below 1.  This 
12a20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c  should. *.be cal
12a30 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  led synchronousl
12a40 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72  y by the ClosePr
12a50 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20  oc, not in the. 
12a60 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  *.EventuallyFree
12a70 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
12a80 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
12a90 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
12aa0 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
12ab0 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
12ac0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b00 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54  -----. */.void T
12b10 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a  ls_Clean(State *
12b20 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
12b30 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
12b40 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
12b50 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
12b60 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65   here that we're
12b70 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
12b80 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
12b90 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
12ba0 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
12bb0 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
12bc0 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
12bd0 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
12be0 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
12bf0 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
12c00 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
12c10 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
12c20 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65   {..ckfree(state
12c30 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73  Ptr->protos);..s
12c40 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
12c50 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
12c60 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
12c70 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20  bio) {../* This 
12c80 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68  will call SSL_sh
12c90 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34  utdown. Bug 1414
12ca0 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  045 */..dprintf(
12cb0 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70  "BIO_free_all(%p
12cc0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69  )", statePtr->bi
12cd0 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c  o);..BIO_free_al
12ce0 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  l(statePtr->bio)
12cf0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ;..statePtr->bio
12d00 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
12d10 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
12d20 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66  >ssl) {..dprintf
12d30 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c  ("SSL_free(%p)",
12d40 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b   statePtr->ssl);
12d50 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65  ..SSL_free(state
12d60 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74  Ptr->ssl);..stat
12d70 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c  ePtr->ssl = NULL
12d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12d90 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b  statePtr->ctx) {
12da0 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73  ..SSL_CTX_free(s
12db0 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
12dc0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
12dd0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
12de0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
12df0 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44  llback) {..Tcl_D
12e00 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
12e10 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
12e20 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  ..statePtr->call
12e30 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  back = NULL;.   
12e40 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
12e50 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b  Ptr->password) {
12e60 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
12e70 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
12e80 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74  sword);..statePt
12e90 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55  r->password = NU
12ea0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LL;.    }..    d
12eb0 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
12ec0 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  g");.}.../*. *--
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f10 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74  -. *. * Tls_Init
12f20 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69   --. *. *.This i
12f30 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74  s a package init
12f40 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
12f50 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63  dure, which is c
12f60 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20  alled. *.by Tcl 
12f70 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67  when this packag
12f80 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64  e is to be added
12f90 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74   to an interpret
12fa0 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
12fb0 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72  s:  Ssl configur
12fc0 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a  ed and loaded. *
12fd0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
12fe0 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65  :. *. create the
12ff0 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e   ssl command, in
13000 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e  itialize ssl con
13010 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  text. *. *------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13060 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  /.DLLEXPORT int 
13070 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Tls_Init(Tcl_Int
13080 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
13090 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c     const char tl
130a0 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d  sTclInitScript[]
130b0 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74   = {.#include "t
130c0 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a  ls.tcl.h"..0x00.
130d0 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69      };..    dpri
130e0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
130f0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
13100 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63   only support Tc
13110 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20  l 8.4 or newer. 
13120 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a      */.    if (.
13130 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  #ifdef USE_TCL_S
13140 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74  TUBS..Tcl_InitSt
13150 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
13160 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c  ", 0).#else..Tcl
13170 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65  _PkgRequire(inte
13180 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d  rp, "Tcl", "8.4-
13190 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d  ", 0).#endif.. =
131a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
131b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
131c0 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c   }..    if (TlsL
131d0 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c  ibInit(0) != TCL
131e0 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _OK) {..Tcl_Appe
131f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13200 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74   "could not init
13210 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61  ialize SSL libra
13220 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ry", NULL);..ret
13230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13240 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72     }..    Tcl_Cr
13250 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13260 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70  nterp, "tls::cip
13270 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62  hers", CiphersOb
13280 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
13290 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
132a0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
132b0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
132c0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
132d0 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63  rp, "tls::connec
132e0 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f  tion", Connectio
132f0 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c  nInfoObjCmd, (Cl
13300 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
13310 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
13320 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
13330 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
13340 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
13350 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
13360 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43  dshakeObjCmd, (C
13370 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
13380 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
13390 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
133a0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
133b0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
133c0 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
133d0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
133e0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
133f0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
13400 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
13410 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13420 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69  nterp, "tls::uni
13430 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
13440 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
13450 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
13460 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
13470 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
13480 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13490 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74  terp, "tls::stat
134a0 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
134b0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
134c0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
134d0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
134e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
134f0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13500 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
13510 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
13520 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
13530 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
13540 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
13550 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
13560 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
13570 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
13580 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
13590 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
135a0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
135b0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
135c0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
135d0 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f  erp, "tls::proto
135e0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73  cols", Protocols
135f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
13600 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
13610 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
13620 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  LL);..    if (in
13630 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61  terp) {..Tcl_Eva
13640 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c  l(interp, tlsTcl
13650 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20  InitScript);.   
13660 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54   }..    return(T
13670 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
13680 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43  terp, "tls", PAC
13690 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a  KAGE_VERSION));.
136a0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
136e0 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e   *. *.Tls_SafeIn
136f0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
13700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
13730 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64  .Standard proced
13740 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  ure required by 
13750 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69  'load'.. *.Initi
13760 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65  alizes this exte
13770 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65  nsion for a safe
13780 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a   interpreter.. *
13790 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
137a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137c0 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
137d0 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66  fects:. *..As of
137e0 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20   'Tls_Init'. *. 
137f0 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20  *.Result:. *..A 
13800 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72  standard Tcl err
13810 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d  or code.. *. *--
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13850 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50  ----*. */.DLLEXP
13860 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65  ORT int Tls_Safe
13870 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
13880 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64  *interp) {.    d
13890 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
138a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73  ;.    return(Tls
138b0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a  _Init(interp));.
138c0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
13900 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74   *. *.TlsLibInit
13910 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
13920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49  ----------*. *.I
13950 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
13960 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20  ibrary once per 
13970 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d  application. *.-
13980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
139b0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
139c0 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c  cts:. *..initial
139d0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
139e0 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
139f0 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d  *..none. *. *---
13a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a30 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ---*. */.static 
13a40 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69  int TlsLibInit(i
13a50 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  nt uninitialize)
13a60 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e   {.    static in
13a70 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  t initialized = 
13a80 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75  0;.    int statu
13a90 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20  s = TCL_OK;.#if 
13aa0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
13ab0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
13ac0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
13ad0 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f  .    size_t num_
13ae0 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20  locks;.#endif.. 
13af0 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c     if (uninitial
13b00 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ize) {.        i
13b10 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
13b20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   {.            d
13b30 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
13b40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62   uninitialize, b
13b50 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  ut we are not in
13b60 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20  itialized");..  
13b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13b80 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  (TCL_OK);.      
13b90 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 70 72    }..        dpr
13ba0 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
13bb0 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a  ninitialize");..
13bc0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
13bd0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
13be0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
13bf0 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c  ADS).        Tcl
13c00 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
13c10 5f 6d 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  _mx);..        i
13c20 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 20  f (locks) {.    
13c30 20 20 20 20 20 20 20 20 66 72 65 65 28 6c 6f 63          free(loc
13c40 6b 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ks);.           
13c50 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20   locks = NULL;. 
13c60 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73             locks
13c70 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  Count = 0;.     
13c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13c90 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
13ca0 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
13cb0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
13cc0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
13cd0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20  L_THREADS).     
13ce0 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f     Tcl_MutexUnlo
13cf0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
13d00 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 72 65  ndif..        re
13d10 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20  turn(TCL_OK);.  
13d20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69    }..    if (ini
13d30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20  tialized) {.    
13d40 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
13d50 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63  led, but using c
13d60 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 20  ached value");. 
13d70 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 73 74         return(st
13d80 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  atus);.    }..  
13d90 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
13da0 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
13db0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
13dc0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
13dd0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54  L_THREADS).    T
13de0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
13df0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20  it_mx);.#endif. 
13e00 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d     initialized =
13e10 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   1;..#if defined
13e20 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
13e30 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
13e40 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75  _THREADS).    nu
13e50 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20  m_locks = 1;.   
13e60 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69   locksCount = (i
13e70 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20  nt) num_locks;. 
13e80 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f     locks = mallo
13e90 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  c(sizeof(*locks)
13ea0 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20   * num_locks);. 
13eb0 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c     memset(locks,
13ec0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b   0, sizeof(*lock
13ed0 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
13ee0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
13ef0 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20  Initialize BOTH 
13f00 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69  libcrypto and li
13f10 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45  bssl. */.    OPE
13f20 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50  NSSL_init_ssl(OP
13f30 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
13f40 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50  SSL_STRINGS | OP
13f50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
13f60 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09  CRYPTO_STRINGS..
13f70 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
13f80 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c  DD_ALL_CIPHERS |
13f90 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
13fa0 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e  D_ALL_DIGESTS, N
13fb0 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e  ULL);..    BIO_n
13fc0 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b  ew_tcl(NULL, 0);
13fd0 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20  ..#if 0.    /*. 
13fe0 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20      * XXX:TODO: 
13ff0 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65  Remove this code
14000 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
14010 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20  with a check.   
14020 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65    * for enough e
14030 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f  ntropy and do no
14040 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  t try to create 
14050 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74  our own.     * t
14060 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a  errible entropy.
14070 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20       */.    /*. 
14080 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72      * Seed the r
14090 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
140a0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53  erator in the SS
140b0 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20  L library,.     
140c0 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77  * using the do/w
140d0 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62  hile construct b
140e0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75  ecause of the bu
140f0 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20  g note in the.  
14100 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51     * OpenSSL FAQ
14110 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f   at http://www.o
14120 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f  penssl.org/suppo
14130 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52  rt/faq.html#USER
14140 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  1.     *.     * 
14150 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20  The crux of the 
14160 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20  problem is that 
14170 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e  Solaris 7 does n
14180 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a  ot have a.     *
14190 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20   /dev/random or 
141a0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76  /dev/urandom dev
141b0 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74  ice so it cannot
141c0 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20   gather enough. 
141d0 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72      * entropy fr
141e0 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64  om the RAND_seed
141f0 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74  () when TLS init
14200 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75  ializes and refu
14210 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f  ses.     * to go
14220 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65   further. Earlie
14230 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70  r versions of Op
14240 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e  enSSL carried on
14250 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
14260 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28    */.    srand((
14270 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69  unsigned int) ti
14280 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55  me((time_t *) NU
14290 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09  LL));.    do {..
142a0 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
142b0 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  16; i++) {..    
142c0 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20  rnd_seed[i] = 1 
142d0 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20  + (char) (255.0 
142e0 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d  * rand()/(RAND_M
142f0 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41  AX+1.0));..}..RA
14300 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64  ND_seed(rnd_seed
14310 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65  , sizeof(rnd_see
14320 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65  d));.    } while
14330 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20   (RAND_status() 
14340 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  != 1);.#endif..#
14350 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
14360 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14370 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14380 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
14390 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
143a0 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
143b0 73 74 61 74 75 73 29 3b 0a 7d 0a                 status);.}.