Hex Artifact Content

Artifact a232f29e3c5e06c035fc39a7e39b69f3eb7fcaa290c77203a6e46f0b37b6b84c:


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 2d 2d 0a 20 2a  or Servers --. *
37d0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76  . *.Perform serv
37e0: 65 72 2d 73 69 64 65 20 70 72 6f 74 6f 63 6f 6c  er-side 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 0a 20 2a 09 57  r callbacks. *.W
3860: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
3870: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
3880: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
3890: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
38a0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
38b0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
38c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
38d0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
38e0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
38f0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
3900: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
3910: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
3920: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
3930: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
3940: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
3950: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
3960: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
3970: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
3980: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
3990: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
39a0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
39b0: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
39c0: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
39d0: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
39e0: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
39f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
3a00: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
3a10: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
3a20: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
3a30: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
3a40: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
3a50: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
3a60: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
3a70: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
3a80: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
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 0a 20 2a 2f 0a 73  ----------. */.s
3ad0: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
3ae0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3af0: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
3b00: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
3b10: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
3b20: 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20  *outlen,..const 
3b30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
3b40: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  n, unsigned int 
3b50: 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67  inlen, void *arg
3b60: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
3b70: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
3b80: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
3b90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
3ba0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
3bb0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
3bc0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
3bd0: 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  ode, res;..    d
3be0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
3bf0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
3c00: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
3c10: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3c20: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
3c30: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
3c40: 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74    /* Select prot
3c50: 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  ocol */.    if (
3c60: 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f  SSL_select_next_
3c70: 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65  proto(out, outle
3c80: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  n, statePtr->pro
3c90: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  tos, statePtr->p
3ca0: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20  rotos_len,..in, 
3cb0: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53  inlen) == OPENSS
3cc0: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44  L_NPN_NEGOTIATED
3cd0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
3ce0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
3cf0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4e    } else {../* N
3d00: 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73  o overlap, so us
3d10: 65 20 66 69 72 73 74 20 63 6c 69 65 6e 74 20 70  e first client p
3d20: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 72 65 73 20  rotocol */..res 
3d30: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
3d40: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
3d50: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
3d60: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
3d70: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
3d80: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
3d90: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  T_ERR_OK;.    }.
3da0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3db0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3dc0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
3dd0: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
3de0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3df0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3e00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3e10: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
3e20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3e30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3e40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3e50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f  _NewStringObj(*o
3e60: 75 74 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  ut, -1));..    T
3e70: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3e80: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
3e90: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
3ea0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3eb0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3ec0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3ed0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3ee0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3ef0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3f00: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3f10: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3f20: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3f30: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3f40: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3f50: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3f60: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3f70: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3f80: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3f90: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3fa0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3fb0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3fc0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3fd0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3fe0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3ff0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
4000: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
4010: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
4020: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
4030: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
4040: 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
4090: 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  SNI Callback for
40a0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
40b0: 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72  *.Perform server
40c0: 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61  -side SNI hostna
40d0: 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74  me selection aft
40e0: 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49  er receiving SNI
40f0: 20 68 65 61 64 65 72 2e 0a 20 2a 09 43 61 6c 6c   header.. *.Call
4100: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63  ed after hello c
4110: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f  allback but befo
4120: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  re ALPN callback
4130: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4140: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4150: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4160: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4170: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
4180: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
4190: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
41a0: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  R_OK: SNI hostna
41b0: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20  me is accepted. 
41c0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
41d0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
41e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
41f0: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73  T_FATAL: SNI hos
4200: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
4210: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
4220: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20  ction. *.    is 
4230: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74  aborted. Default
4240: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53   for alert is SS
4250: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
4260: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54  D_NAME.. *.SSL_T
4270: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
4280: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73  WARNING: SNI hos
4290: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
42a0: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61  epted, warning a
42b0: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74  lert. *.    sent
42c0: 20 28 6e 6f 74 20 69 6e 20 54 4c 53 76 31 2e 33   (not in TLSv1.3
42d0: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ). The connectio
42e0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
42f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4300: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  OACK: SNI hostna
4310: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
4320: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f  ed and not ackno
4330: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20  wledged,. *.    
4340: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20  e.g. if SNI has 
4350: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  not been configu
4360: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  red. The connect
4370: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
4380: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
43d0: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61  ic int.SNICallba
43e0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
43f0: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
4400: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
4410: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
4420: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
4430: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
4440: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
4450: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
4460: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
4470: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
4480: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
4490: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
44a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
44b0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
44c0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
44d0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
44e0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
44f0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4500: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53    servername = S
4510: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
4520: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
4530: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
4540: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76  );.    if (!serv
4550: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72  ername || server
4560: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  name[0] == '\0')
4570: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
4580: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4590: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
45a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
45b0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
45c0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
45d0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
45e0: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  T_ERR_OK;.    }.
45f0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4600: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4610: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4620: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
4630: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4640: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4650: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4660: 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20  j("sni", -1));. 
4670: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4680: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4690: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
46a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
46b0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
46c0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
46d0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
46e0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
46f0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
4700: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
4710: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
4720: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4730: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
4740: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4750: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
4760: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69  L_GLOBAL);.    i
4770: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f  f (code != TCL_O
4780: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  K) {.#if (TCL_MA
4790: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
47a0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
47b0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
47c0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
47d0: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
47e0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
47f0: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
4800: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
4810: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
4820: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4830: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c  r);..    Tcl_Rel
4840: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
4850: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
4860: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
4870: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
4880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53  );.    return SS
4890: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
48a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
48f0: 0a 20 2a 20 48 65 6c 6c 6f 20 48 61 6e 64 73 68  . * Hello Handsh
4900: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ake Callback for
4910: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
4920: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72  *.Used by server
4930: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20   to examine the 
4940: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
4950: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74  cation (SNI) ext
4960: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64  ension. *.provid
4970: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74  ed by the client
4980: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c   in order to sel
4990: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ect an appropria
49a0: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  te certificate t
49b0: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e  o. *.present, an
49c0: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e  d make other con
49d0: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73  figuration adjus
49e0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20  tments relevant 
49f0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20  to that server. 
4a00: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63  *.name and its c
4a10: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
4a20: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70  is includes swap
4a30: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73  ping out the ass
4a40: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43  ociated. *.SSL_C
4a50: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69  TX pointer, modi
4a60: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  fying the server
4a70: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69  's list of permi
4a80: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e  tted TLS version
4a90: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74  s,. *.changing t
4aa0: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68  he server's ciph
4ab0: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f  er list in respo
4ac0: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  nse to the clien
4ad0: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c  t's cipher list,
4ae0: 20 65 74 63 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   etc.. *. * Resu
4af0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4b00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4b10: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4b20: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4b30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4b40: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  es:. *.SSL_CLIEN
4b50: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 20 3d 20  T_HELLO_RETRY = 
4b60: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
4b70: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
4b80: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
4b90: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
4ba0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
4bb0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
4bc0: 52 4f 52 20 3d 20 66 61 69 6c 75 72 65 2c 20 74  ROR = failure, t
4bd0: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74  erminate connect
4be0: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74  ion. Set alert t
4bf0: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  o error code.. *
4c00: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
4c10: 4f 5f 53 55 43 43 45 53 53 20 3d 20 73 75 63 63  O_SUCCESS = succ
4c20: 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ess. *. *-------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4c70: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c  .static int.Hell
4c80: 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  oCallback(const 
4c90: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
4ca0: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
4cb0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
4cc0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
4cd0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
4ce0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
4cf0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
4d00: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
4d10: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
4d20: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
4d30: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a  ar *servername;.
4d40: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4d50: 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20  ed char *p;.    
4d60: 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61  size_t len, rema
4d70: 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69  ining;..    dpri
4d80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
4d90: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4da0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
4db0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
4dc0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
4dd0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
4de0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4df0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
4e00: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
4e10: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
4e20: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
4e30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
4e40: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66   names */.    if
4e50: 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65   (!SSL_client_he
4e60: 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c  llo_get0_ext(ssl
4e70: 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65  , TLSEXT_TYPE_se
4e80: 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26  rver_name, &p, &
4e90: 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65  remaining) || re
4ea0: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
4eb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4ec0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
4ed0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
4ee0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
4ef0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
4f00: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20  upplied list of 
4f10: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65  names. */.    le
4f20: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
4f30: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
4f40: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
4f50: 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69  n + 2 != remaini
4f60: 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  ng) {.        re
4f70: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
4f80: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
4f90: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
4fa0: 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20   = len;..    /* 
4fb0: 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63  The list in prac
4fc0: 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20  tice only has a 
4fd0: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20  single element, 
4fe0: 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  so we only consi
4ff0: 64 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e  der the first on
5000: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
5010: 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20  maining == 0 || 
5020: 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e  *p++ != TLSEXT_N
5030: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
5040: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e) {.        ret
5050: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
5060: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
5070: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d  }.    remaining-
5080: 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77  -;..    /* Now w
5090: 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75  e can finally pu
50a0: 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20  ll out the byte 
50b0: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61  array with the a
50c0: 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20  ctual hostname. 
50d0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
50e0: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 20  ning <= 2) {.   
50f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f       return SSL_
5100: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
5110: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  OR;.    }.    le
5120: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
5130: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
5140: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
5150: 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e  n + 2 > remainin
5160: 67 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  g) {.        ret
5170: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
5180: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
5190: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20  }.    remaining 
51a0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65  = len;.    serve
51b0: 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  rname = (const c
51c0: 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 63 6d  har *)p;..    cm
51d0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
51e0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
51f0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
5200: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5210: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5220: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5230: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c  wStringObj("hell
5240: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
5250: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5270: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
5280: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
5290: 6d 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b  me, (int) len));
52a0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
52b0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
52c0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
52d0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
52e0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
52f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
5300: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5310: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
5320: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
5330: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
5340: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
5350: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
5360: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d  OK) {.#if (TCL_M
5370: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20  AJOR_VERSION == 
5380: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52  8) && (TCL_MINOR
5390: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54  _VERSION < 6)..T
53a0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
53b0: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73  or(interp);.#els
53c0: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  e..Tcl_Backgroun
53d0: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
53e0: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
53f0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
5400: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
5410: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
5420: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
5430: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
5440: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
5450: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
5460: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
5470: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
5480: 53 55 43 43 45 53 53 3b 0a 7d 0a 0c 0a 2f 2a 2a  SUCCESS;.}.../**
5490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54a0: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  **/./* Commands 
54b0: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
54c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54d0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5520: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
5530: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
5540: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09  e ciphers. *. *.
5550: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
5560: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
5570: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63  cess the "tls::c
5580: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a  iphers" command.
5590: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
55a0: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61  able ciphers, ba
55b0: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f  sed upon protoco
55c0: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20  l selected.. *. 
55d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
55e0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
55f0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
5600: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5610: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20  .constructs and 
5620: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e  destroys SSL con
5630: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
5690: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
56a0: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
56b0: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
56c0: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
56d0: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
56e0: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
56f0: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
5700: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
5710: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
5720: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
5730: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
5740: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61  TLS_NONE.};..sta
5750: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f  tic int.CiphersO
5760: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
5770: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
5780: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5790: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
57a0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
57b0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
57c0: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
57d0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
57e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
57f0: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
5800: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
5810: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
5820: 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55  char *cp, buf[BU
5830: 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69  FSIZ];.    int i
5840: 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20  ndex, verbose = 
5850: 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64  0, use_supported
5860: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
5870: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
5880: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32     if ((objc < 2
5890: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
58a0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
58b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
58c0: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  objv, "protocol 
58d0: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f  ?verbose? ?suppo
58e0: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e  rted?");..return
58f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5900: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
5910: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
5920: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70  terp, objv[1], p
5930: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f  rotocols, "proto
5940: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  col", 0, &index)
5950: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
5960: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5970: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
5980: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c  objc > 2) && Tcl
5990: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
59a0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
59b0: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d  2], &verbose) !=
59c0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
59d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
59e0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
59f0: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65  c > 3) && Tcl_Ge
5a00: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
5a10: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
5a20: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   &use_supported)
5a30: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
5a40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5a50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
5a60: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
5a70: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
5a80: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78  m protocol)index
5a90: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  ) {..case TLS_SS
5aa0: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  L2:.#if OPENSSL_
5ab0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
5ac0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
5ad0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
5ae0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
5af0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20  NSSL_NO_SSL2).. 
5b00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5b10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
5b20: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
5b30: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
5b40: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
5b50: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
5b60: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
5b70: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
5b80: 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68 6f  _new(SSLv2_metho
5b90: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  d()); break;.#en
5ba0: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  dif..case TLS_SS
5bb0: 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  L3:.#if defined(
5bc0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
5bd0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
5be0: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
5bf0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f  OPENSSL_NO_SSL3_
5c00: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
5c10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5c20: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
5c30: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
5c40: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
5c50: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
5c60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5c70: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
5c80: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53   = SSL_CTX_new(S
5c90: 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20  SLv3_method()); 
5ca0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
5cb0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69  ase TLS_TLS1:.#i
5cc0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
5cd0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
5ce0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c  ENSSL_NO_TLS1) |
5cf0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
5d00: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
5d10: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
5d20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5d30: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
5d40: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
5d50: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
5d60: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
5d70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
5d80: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c  e..    ctx = SSL
5d90: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d  _CTX_new(TLSv1_m
5da0: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
5db0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
5dc0: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65  S_TLS1_1:.#if de
5dd0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
5de0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
5df0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  SSL_NO_TLS1_1) |
5e00: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
5e10: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
5e20: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
5e30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5e40: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
5e50: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
5e60: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
5e70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
5e80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
5e90: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53  lse..    ctx = S
5ea0: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31  SL_CTX_new(TLSv1
5eb0: 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  _1_method()); br
5ec0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
5ed0: 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69  e TLS_TLS1_2:.#i
5ee0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
5ef0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
5f00: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
5f10: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
5f20: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f  ENSSL_NO_TLS1_2_
5f30: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
5f40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5f50: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
5f60: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
5f70: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
5f80: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
5f90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5fa0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
5fb0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54   = SSL_CTX_new(T
5fc0: 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 29  LSv1_2_method())
5fd0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
5fe0: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33  .case TLS_TLS1_3
5ff0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
6000: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
6010: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
6020: 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f  LS1_3)..    Tcl_
6030: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6040: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
6050: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
6060: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
6070: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
6080: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6090: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20  .#else..    ctx 
60a0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c  = SSL_CTX_new(TL
60b0: 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 20  S_method());.   
60c0: 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58           SSL_CTX
60d0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
60e0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
60f0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20  _3_VERSION);..  
6100: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61    SSL_CTX_set_ma
6110: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
6120: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
6130: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ION);..    break
6140: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c  ;.#endif..defaul
6150: 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  t:..    break;. 
6160: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78     }.    if (ctx
6170: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
6180: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6190: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20  terp, REASON(), 
61a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
61b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
61c0: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
61d0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
61e0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
61f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
6200: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e  t(interp, REASON
6210: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  (), NULL);..SSL_
6220: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
6230: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6250: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64  Use list and ord
6260: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  er as would be s
6270: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48  ent in a ClientH
6280: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69  ello or all avai
6290: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f  lable ciphers */
62a0: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70  .    if (use_sup
62b0: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20  ported) {..sk = 
62c0: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74  SSL_get1_support
62d0: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b  ed_ciphers(ssl);
62e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
62f0: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68  k = SSL_get_ciph
6300: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  ers(ssl);.    }.
6310: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e  .    if (sk != N
6320: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72  ULL) {..if (!ver
6330: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a  bose) {..    obj
6340: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
6350: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
6360: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
6370: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
6380: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
6390: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
63a0: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
63b0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
63c0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
63d0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
63e0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
63f0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
6400: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
6410: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
6420: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
6430: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
6440: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6450: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
6460: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
6470: 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29  ringObj(cp, -1))
6480: 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73  ;..    }...} els
6490: 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20  e {..    objPtr 
64a0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
64b0: 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66  bj("",0);..    f
64c0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
64d0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
64e0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b  _num(sk); i++) {
64f0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50  ...const SSL_CIP
6500: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f  HER *c = sk_SSL_
6510: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c  CIPHER_value(sk,
6520: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20   i);...if (c == 
6530: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NULL) continue;.
6540: 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65  .../* textual de
6550: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
6560: 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20   cipher */...if 
6570: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
6580: 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20  ription(c, buf, 
6590: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20  sizeof(buf)) != 
65a0: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
65b0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
65c0: 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74 29  jPtr, buf, (int)
65d0: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09   strlen(buf));..
65e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
65f0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
6600: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e  objPtr, "UNKNOWN
6610: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20  \n", 8);...}..  
6620: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f    }..}..if (use_
6630: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20  supported) {..  
6640: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f    sk_SSL_CIPHER_
6650: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20  free(sk);..}.   
6660: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28   }.    SSL_free(
6670: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ssl);.    SSL_CT
6680: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20  X_free(ctx);..  
6690: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
66a0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
66b0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
66c0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
66d0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
66e0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6730: 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  . * ProtocolsObj
6740: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69  Cmd -- list avai
6750: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a  lable protocols.
6760: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
6770: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
6780: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
6790: 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20  tls::protocols" 
67a0: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69  command. *.to li
67b0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
67c0: 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65  tocols.. *. * Re
67d0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
67e0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20  dard Tcl result 
67f0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  list.. *. * Side
6800: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
6810: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6860: 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63  tatic int.Protoc
6870: 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  olsObjCmd(Client
6880: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
6890: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
68a0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
68b0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
68c0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
68d0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20  Obj *objPtr;..  
68e0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
68f0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
6900: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f  jc != 1) {..Tcl_
6910: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
6920: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
6930: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
6940: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6950: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65   objPtr = Tcl_Ne
6960: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
6970: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  );..#if OPENSSL_
6980: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
6990: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
69a0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
69b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
69c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
69d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
69e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
69f0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
6a00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
6a10: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d  tocols[TLS_SSL2]
6a20: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
6a30: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
6a40: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
6a50: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
6a60: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
6a70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6a80: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
6a90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6aa0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
6ab0: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L3], -1));.#endi
6ac0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
6ad0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
6ae0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
6af0: 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  LS1).    Tcl_Lis
6b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6b10: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
6b20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6b30: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
6b40: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  _TLS1], -1));.#e
6b50: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
6b60: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
6b70: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
6b80: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
6b90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6ba0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6bb0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
6bc0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
6bd0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c  ols[TLS_TLS1_1],
6be0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
6bf0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
6c00: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
6c10: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
6c20: 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_2).    Tcl_Lis
6c30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6c40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
6c50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6c60: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
6c70: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_2], -1));.
6c80: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
6c90: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
6ca0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
6cb0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
6cc0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6cd0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6ce0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
6cf0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
6d00: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33  ocols[TLS_TLS1_3
6d10: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
6d20: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
6d30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
6d40: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
6d50: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
6d60: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
6d70: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65  . *. * Handshake
6dd0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
6de0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
6df0: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77  used to verify w
6e00: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73  hether the hands
6e10: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  hake is complete
6e20: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20  . *.or not.. *. 
6e30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
6e40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6e50: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e  ult. 1 means han
6e60: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c  dshake complete,
6e70: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67   0 means pending
6e80: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
6e90: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72  ects:. *.May for
6ea0: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  ce SSL negotiati
6eb0: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65  on to take place
6ec0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6f10: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68  tatic int Handsh
6f20: 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  akeObjCmd(Client
6f30: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
6f40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6f50: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
6f60: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
6f70: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
6f80: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20  Channel chan;   
6f90: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e       /* The chan
6fa0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
6fb0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
6fc0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20  te *statePtr;   
6fd0: 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73       /* client s
6fe0: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
6ff0: 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ket */.    const
7000: 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20   char *errStr = 
7010: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65  NULL;.    int re
7020: 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65  t = 1;.    int e
7030: 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  rr = 0;..    dpr
7040: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
7050: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
7060: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
7070: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7080: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
7090: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  l");..return(TCL
70a0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
70b0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
70c0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
70d0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
70e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
70f0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
7100: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
7110: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
7120: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
7130: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
7140: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
7150: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
7160: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
7170: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
7180: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
7190: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
71a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
71b0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
71c0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
71d0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
71e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
71f0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
7200: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
7210: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74  (chan), "\": not
7220: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
7230: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
7240: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
7250: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
7260: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
7270: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
7280: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
7290: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
72a0: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
72b0: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20  nect");.    ret 
72c0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
72d0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
72e0: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72  err, 1);.    dpr
72f0: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f  intf("Tls_WaitFo
7300: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65  rConnect returne
7310: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20  d: %i", ret);.. 
7320: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26     if (ret < 0 &
7330: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  & ((statePtr->fl
7340: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
7350: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20  YNC) && (err == 
7360: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72  EAGAIN))) {..dpr
7370: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20  intf("Async set 
7380: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e  and err = EAGAIN
7390: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20  ");..ret = 0;.  
73a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74    } else if (ret
73b0: 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20   < 0) {..errStr 
73c0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b  = statePtr->err;
73d0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c  ..Tcl_ResetResul
73e0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f  t(interp);..Tcl_
73f0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a  SetErrno(err);..
7400: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20  .if (!errStr || 
7410: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20  (*errStr == 0)) 
7420: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20  {..    errStr = 
7430: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
7440: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c  nterp);..}...Tcl
7450: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7460: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65  terp, "handshake
7470: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53   failed: ", errS
7480: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  tr, (char *) NUL
7490: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
74a0: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
74b0: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
74c0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
74d0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54  rStr);..return(T
74e0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
74f0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72   else {..if (err
7500: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   != 0) {..    dp
7510: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72  rintf("Got an er
7520: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c  ror with a compl
7530: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20  eted handshake: 
7540: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b  err = %i", err);
7550: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20  ..}..ret = 1;.  
7560: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
7570: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
7580: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25  OK with data \"%
7590: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20  i\"", ret);.    
75a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
75b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
75c0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20  IntObj(ret));.  
75d0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
75e0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
75f0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f  clientData;.}../
7600: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
7650: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
7660: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
7670: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
7680: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
7690: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
76a0: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
76b0: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
76c0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
76d0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
76e0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
76f0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
7700: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
7710: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
7720: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
7730: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
7740: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
77a0: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
77b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
77c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
77d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
77e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
77f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
7800: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
7810: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
7820: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
7830: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
7840: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
7850: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
7860: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
7870: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7880: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7890: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63  .    Tcl_Obj *sc
78a0: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e  ript.        = N
78b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
78c0: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20   *password.     
78d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
78e0: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72  cl_DString upper
78f0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
7900: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  on, upperChannel
7910: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43  Blocking, upperC
7920: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20  hannelEncoding, 
7930: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
7940: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  har;.    int idx
7950: 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66  , len;.    int f
7960: 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20  lags..        = 
7970: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20  TLS_TCL_INIT;.  
7980: 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20    int server..  
7990: 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73        = 0;./* is
79a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f   connection inco
79b0: 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67  ming or outgoing
79c0: 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b  ? */.    char *k
79d0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
79e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
79f0: 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20  *certfile.      
7a00: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e    = NULL;.    un
7a10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
7a20: 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69    .= NULL;.    i
7a30: 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20  nt key_len      
7a40: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
7a50: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7a60: 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 20  r *cert         
7a70: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
7a80: 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20  cert_len        
7a90: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
7aa0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20   char *ciphers. 
7ab0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
7ac0: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
7ad0: 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20  uites.        = 
7ae0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
7af0: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  CAfile.        =
7b00: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
7b10: 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20  *CAdir..        
7b20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
7b30: 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20   *DHparams.     
7b40: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
7b50: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20  har *model..    
7b60: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7b70: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
7b80: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7b90: 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72  ./* hostname for
7ba0: 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64   Server Name Ind
7bb0: 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ication */.    c
7bc0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7bd0: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d  ar *session_id =
7be0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
7bf0: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c  bj *alpn..= NULL
7c00: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d  ;.    int ssl2 =
7c10: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20   0, ssl3 = 0;.  
7c20: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20    int tls1 = 1, 
7c30: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31  tls1_1 = 1, tls1
7c40: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d  _2 = 1, tls1_3 =
7c50: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74   1;.    int prot
7c60: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d  o = 0, level = -
7c70: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66  1;.    int verif
7c80: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d  y = 0, require =
7c90: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c   0, request = 1,
7ca0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
7cb0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
7cc0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
7cd0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7ce0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
7cf0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
7d00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7d10: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
7d20: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69  NO_SSL2) && defi
7d30: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
7d40: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
7d50: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54   && defined(NO_T
7d60: 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65  LS1_1) && define
7d70: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
7d80: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7d90: 33 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b  3).    ssl2 = 1;
7da0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
7db0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7dc0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
7dd0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65  d(NO_SSL3) && de
7de0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
7df0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  & defined(NO_TLS
7e00: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  1) && defined(NO
7e10: 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69  _TLS1_1) && defi
7e20: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
7e30: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  & defined(NO_TLS
7e40: 31 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20  1_3).    ssl3 = 
7e50: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  1;.#endif.#if de
7e60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
7e70: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7e80: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74  L_NO_TLS1).    t
7e90: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ls1 = 0;.#endif.
7ea0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7eb0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
7ec0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7ed0: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20  1_1).    tls1_1 
7ee0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
7ef0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7f00: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
7f10: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
7f20: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b  .    tls1_2 = 0;
7f30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
7f40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
7f50: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7f60: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
7f70: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e   tls1_3 = 0;.#en
7f80: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  dif..    if (obj
7f90: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
7fa0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
7fb0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
7fc0: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29  nnel ?options?")
7fd0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7fe0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7ff0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
8000: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
8010: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
8020: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c  bj(objv[1], NULL
8030: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
8040: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
8050: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
8060: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8070: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8080: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
8090: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
80a0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
80b0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
80c0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
80d0: 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64  n);..    for (id
80e0: 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a  x = 2; idx < obj
80f0: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61  c; idx++) {..cha
8100: 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74  r *opt = Tcl_Get
8110: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8120: 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a  jv[idx], NULL);.
8130: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20  ..if (opt[0] != 
8140: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b  '-')..    break;
8150: 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69  ...OPTSTR("-cadi
8160: 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54  r", CAdir);..OPT
8170: 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43  STR("-cafile", C
8180: 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  Afile);..OPTSTR(
8190: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
81a0: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  tfile);..OPTSTR(
81b0: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65  "-cipher", ciphe
81c0: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
81d0: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73  iphers", ciphers
81e0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
81f0: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68  hersuites", ciph
8200: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f  ersuites);..OPTO
8210: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  BJ("-command", s
8220: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
8230: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70  "-dhparams", DHp
8240: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28  arams);..OPTSTR(
8250: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66  "-keyfile", keyf
8260: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ile);..OPTSTR("-
8270: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a  model", model);.
8280: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f  .OPTOBJ("-passwo
8290: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a  rd", password);.
82a0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f  .OPTBOOL("-post_
82b0: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74  handshake", post
82c0: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50  _handshake);..OP
82d0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22  TBOOL("-require"
82e0: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54  , require);..OPT
82f0: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c  BOOL("-request",
8300: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 49   request);..OPTI
8310: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76  NT("-securitylev
8320: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50  el", level);..OP
8330: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c  TBOOL("-server",
8340: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54   server);..OPTST
8350: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c  R("-servername",
8360: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f   servername);..O
8370: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f  PTSTR("-session_
8380: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29  id", session_id)
8390: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e  ;..OPTOBJ("-alpn
83a0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 42 4f  ", alpn);..OPTBO
83b0: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32  OL("-ssl2", ssl2
83c0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
83d0: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54  l3", ssl3);..OPT
83e0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c  BOOL("-tls1", tl
83f0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  s1);..OPTBOOL("-
8400: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29  tls1.1", tls1_1)
8410: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
8420: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
8430: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33  OPTBOOL("-tls1.3
8440: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54  ", tls1_3);..OPT
8450: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65  BYTE("-cert", ce
8460: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09  rt, cert_len);..
8470: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20  OPTBYTE("-key", 
8480: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a  key, key_len);..
8490: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22  .OPTBAD("option"
84a0: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72  , "-alpn, -cadir
84b0: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74  , -cafile, -cert
84c0: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
84d0: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69  pher, -ciphersui
84e0: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  tes, -command, -
84f0: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
8500: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
8510: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65  , -password, -re
8520: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c  quire, -request,
8530: 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c   -securitylevel,
8540: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65   -server, -serve
8550: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f  rname, -session_
8560: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33  id, -ssl2, -ssl3
8570: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31  , -tls1, -tls1.1
8580: 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 2d 74  , -tls1.2, or -t
8590: 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72  ls1.3");...retur
85a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
85b0: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
85c0: 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c  st).    verify |
85d0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  = SSL_VERIFY_CLI
85e0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56  ENT_ONCE | SSL_V
85f0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20  ERIFY_PEER;.    
8600: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72  if (request && r
8610: 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c  equire) verify |
8620: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  = SSL_VERIFY_FAI
8630: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
8640: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  T;.    if (reque
8650: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
8660: 68 61 6b 65 29 20 20 76 65 72 69 66 79 20 7c 3d  hake)  verify |=
8670: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
8680: 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20  _HANDSHAKE;.    
8690: 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29  if (verify == 0)
86a0: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
86b0: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
86c0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
86d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
86e0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
86f0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
8700: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
8710: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
8720: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
8730: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
8740: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
8750: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8760: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
8770: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
8780: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
8790: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
87a0: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
87b0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
87c0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
87d0: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
87e0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
87f0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
8800: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
8810: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
8820: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8830: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
8840: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
8850: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8860: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
8870: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
8880: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
8890: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
88a0: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
88b0: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
88c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
88d0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
88e0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
88f0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
8900: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
8910: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
8920: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
8930: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
8940: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
8950: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
8960: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
8970: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
8980: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8990: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72  CAdir && !*CAdir
89a0: 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09  ).        CAdir.
89b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
89c0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
89d0: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
89e0: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
89f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
8a00: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
8a10: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
8a20: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
8a30: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
8a40: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
8a50: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
8a60: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
8a70: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
8a80: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
8a90: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
8aa0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
8ab0: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
8ac0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
8ad0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
8ae0: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
8af0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
8b00: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
8b10: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
8b20: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
8b30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
8b40: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
8b50: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
8b60: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
8b70: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
8b80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
8b90: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
8ba0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
8bb0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
8bc0: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
8bd0: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
8be0: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
8bf0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
8c00: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
8c10: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
8c20: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
8c30: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
8c40: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
8c50: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
8c60: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
8c70: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21  .    if (model !
8c80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d  = NULL) {..int m
8c90: 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65  ode;../* Get the
8ca0: 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74   "model" context
8cb0: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
8cc0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8cd0: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29  p, model, &mode)
8ce0: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
8cf0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
8d00: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
8d10: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
8d20: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
8d30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
8d40: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
8d50: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
8d60: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
8d70: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
8d80: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
8d90: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
8da0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
8db0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
8dc0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
8dd0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
8de0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8df0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
8e00: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
8e10: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
8e20: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
8e30: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  nnel", NULL);.. 
8e40: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
8e50: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
8e60: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8e70: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
8e80: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
8e90: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
8ea0: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
8eb0: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
8ec0: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
8ed0: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
8ee0: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
8ef0: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
8f00: 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f   key, cert, key_
8f10: 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c  len,..    cert_l
8f20: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
8f30: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
8f40: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
8f50: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
8f60: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
8f70: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
8f80: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
8f90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8fa0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
8fb0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
8fc0: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
8fd0: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
8fe0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
8ff0: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
9000: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
9010: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
9020: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
9030: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
9040: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
9050: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
9060: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
9070: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
9080: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
9090: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
90a0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
90b0: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
90c0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
90d0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
90e0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
90f0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
9100: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
9110: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
9120: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
9130: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
9140: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
9150: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
9160: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
9170: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
9180: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9190: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
91a0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
91b0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
91c0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
91d0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
91e0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
91f0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
9200: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
9210: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
9220: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
9230: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
9240: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
9250: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
9260: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
9270: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9280: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
9290: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
92a0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
92b0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
92c0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
92d0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
92e0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
92f0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9300: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
9310: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
9320: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
9330: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
9340: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
9350: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
9360: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
9370: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
9380: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
9390: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
93a0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
93b0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
93c0: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
93d0: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
93e0: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
93f0: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
9400: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
9410: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
9420: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
9430: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
9440: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
9450: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
9460: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
9470: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
9480: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
9490: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
94a0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
94b0: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63   */..Tls_Free((c
94c0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
94d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
94e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
94f0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
9500: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
9510: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
9520: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
9530: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
9540: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
9550: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
9560: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9570: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
9580: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
9590: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
95a0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
95b0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
95c0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
95d0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
95e0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
95f0: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
9600: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9610: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
9620: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
9630: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9640: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
9650: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
9660: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
9670: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9680: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
9690: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
96a0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
96b0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
96c0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
96d0: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
96e0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
96f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
9700: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
9710: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
9720: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9730: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
9740: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
9750: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  on: ", REASON(),
9760: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9770: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72  ..Tls_Free((char
9780: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
9790: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
97a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
97b0: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
97c0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
97d0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
97e0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
97f0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
9800: 6e 20 28 53 4e 49 29 20 43 6c 69 65 6e 74 48 65  n (SNI) ClientHe
9810: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
9820: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74  ..if (!SSL_set_t
9830: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28  lsext_host_name(
9840: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
9850: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65  ervername) && re
9860: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63  quire) {..    Tc
9870: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9880: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20  nterp, "setting 
9890: 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78  TLS host name ex
98a0: 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c  tension failed",
98b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
98c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73  .            Tls
98d0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
98e0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20  tatePtr);.      
98f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9900: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
9910: 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65  }.../* Configure
9920: 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d   server host nam
9930: 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20  e checks in the 
9940: 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20  SSL client. Set 
9950: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a  DNS hostname to.
9960: 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65  .   name for pee
9970: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  r certificate ch
9980: 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68  ecks. SSL_set1_h
9990: 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69  ost has limitati
99a0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
99b0: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
99c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
99d0: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
99e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
99f0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
9a00: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
9a10: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
9a20: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20   NULL);.        
9a30: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
9a40: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
9a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
9a60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
9a70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9a80: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69  Resume session i
9a90: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73  d */.    if (ses
9aa0: 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65  sion_id && strle
9ab0: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d  n(session_id) <=
9ac0: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58   SSL_MAX_SID_CTX
9ad0: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53  _LENGTH) {../* S
9ae0: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29  SL_set_session()
9af0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45   */..if (!SSL_SE
9b00: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f  SSION_set1_id_co
9b10: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65  ntext(SSL_get_se
9b20: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  ssion(statePtr->
9b30: 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ssl), session_id
9b40: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
9b50: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f   strlen(session_
9b60: 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  id))) {..    Tcl
9b70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9b80: 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65  terp, "Resume se
9b90: 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73  ssion id ", sess
9ba0: 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64  ion_id, " failed
9bb0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9bc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
9bd0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
9be0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
9bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
9c00: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
9c10: 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e   }..    if (alpn
9c20: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20  ) {../* Convert 
9c30: 61 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f 20  a Tcl list into 
9c40: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  a protocol-list 
9c50: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a  in wire-format *
9c60: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  /..unsigned char
9c70: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75   *protos, *p;..u
9c80: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74  nsigned int prot
9c90: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74  os_len = 0;..int
9ca0: 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54   i, len, cnt;..T
9cb0: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a  cl_Obj **list;..
9cc0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
9cd0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
9ce0: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20  rp, alpn, &cnt, 
9cf0: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  &list) != TCL_OK
9d00: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
9d10: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
9d20: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
9d30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
9d40: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
9d50: 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
9d60: 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f  ed for the proto
9d70: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72  col-list */..for
9d80: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74   (i = 0; i < cnt
9d90: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63  ; i++) {..    Tc
9da0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9db0: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e  bj(list[i], &len
9dc0: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20  );..    if (len 
9dd0: 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41  > 255) {...Tcl_A
9de0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9df0: 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63  rp, "ALPN protoc
9e00: 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67  ol name too long
9e10: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9e20: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63  );...Tls_Free((c
9e30: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
9e40: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
9e50: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
9e60: 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20    protos_len += 
9e70: 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a  1 + len;..}.../*
9e80: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c   Build the compl
9e90: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ete protocol-lis
9ea0: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63  t */..protos = c
9eb0: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65  kalloc(protos_le
9ec0: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c  n);../* protocol
9ed0: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f  -lists consist o
9ee0: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70  f 8-bit length-p
9ef0: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74  refixed, byte st
9f00: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69  rings */..for (i
9f10: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73   = 0, p = protos
9f20: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
9f30: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72  {..    char *str
9f40: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9f50: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c  FromObj(list[i],
9f60: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b   &len);..    *p+
9f70: 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65  + = len;..    me
9f80: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e  mcpy(p, str, len
9f90: 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e  );..    p += len
9fa0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65  ;..}.../* SSL_se
9fb0: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61  t_alpn_protos ma
9fc0: 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  kes a copy of th
9fd0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
9fe0: 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69  */../* Note: Thi
9ff0: 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65  s functions reve
a000: 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20  rses the return 
a010: 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e  value convention
a020: 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74   */..if (SSL_set
a030: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61  _alpn_protos(sta
a040: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74  tePtr->ssl, prot
a050: 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29  os, protos_len))
a060: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a070: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a080: 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20   "failed to set 
a090: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c  ALPN protocols",
a0a0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a0b0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
a0c0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
a0d0: 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70  );..    ckfree(p
a0e0: 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74  rotos);..    ret
a0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a100: 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f  }.../* Store pro
a110: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09  tocols list */..
a120: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
a130: 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74   = protos;..stat
a140: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
a150: 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20   = protos_len;. 
a160: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61     } else {..sta
a170: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
a180: 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d  NULL;..statePtr-
a190: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b  >protos_len = 0;
a1a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
a1b0: 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61      * SSL Callba
a1c0: 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  cks.     */.    
a1d0: 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  SSL_set_app_data
a1e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
a1f0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
a200: 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b  );./* point back
a210: 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53   to us */.    SS
a220: 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61  L_set_verify(sta
a230: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69  tePtr->ssl, veri
a240: 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61  fy, VerifyCallba
a250: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ck);.    SSL_CTX
a260: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61  _set_info_callba
a270: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ck(statePtr->ctx
a280: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b  , InfoCallback);
a290: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
a2a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20  Tcl_Channel BIO 
a2b0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73  Handler */.    s
a2c0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d  tatePtr->p_bio.=
a2d0: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61   BIO_new_tcl(sta
a2e0: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  tePtr, BIO_NOCLO
a2f0: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  SE);.    statePt
a300: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  r->bio.= BIO_new
a310: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a  (BIO_f_ssl());..
a320: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20      if (server) 
a330: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c  {../* Server cal
a340: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43  lbacks */..SSL_C
a350: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65  TX_set_tlsext_se
a360: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61  rvername_arg(sta
a370: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
a380: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
a390: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
a3a0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61  xt_servername_ca
a3b0: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
a3c0: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63  >ctx, SNICallbac
a3d0: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  k);..SSL_CTX_set
a3e0: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62  _client_hello_cb
a3f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
a400: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  HelloCallback, (
a410: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
a420: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  ;..if (statePtr-
a430: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
a440: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
a450: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f  set_alpn_select_
a460: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
a470: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
a480: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
a490: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c  );..}.../* Enabl
a4a0: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64  e server to send
a4b0: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66   cert request af
a4c0: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54  ter handshake (T
a4d0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a  LS 1.3 only) */.
a4e0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
a4f0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
a500: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66  {..    SSL_verif
a510: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61  y_client_post_ha
a520: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72  ndshake(statePtr
a530: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 73 74 61  ->ssl);..}...sta
a540: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
a550: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a  TLS_TCL_SERVER;.
a560: 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f  .SSL_set_accept_
a570: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
a580: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
a590: 20 7b 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63   {../* Session c
a5a0: 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43  aching */..SSL_C
a5b0: 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_set_session_c
a5c0: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
a5d0: 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53  tr->ctx, SSL_SES
a5e0: 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c  S_CACHE_CLIENT |
a5f0: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
a600: 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52  NO_INTERNAL_STOR
a610: 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73  E);..SSL_CTX_ses
a620: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61  s_set_new_cb(sta
a630: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73  tePtr->ctx, Sess
a640: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09  ionCallback);...
a650: 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68  /* Enable post h
a660: 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74  andshake Authent
a670: 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f  ication extensio
a680: 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c  n. TLS 1.3 only,
a690: 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a   not http/2. */.
a6a0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
a6b0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
a6c0: 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70  {..    SSL_set_p
a6d0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75  ost_handshake_au
a6e0: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
a6f0: 2c 20 31 29 3b 0a 09 7d 0a 0a 09 53 53 4c 5f 73  , 1);..}...SSL_s
a700: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
a710: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
a720: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73  .    }.    SSL_s
a730: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d  et_bio(statePtr-
a740: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e  >ssl, statePtr->
a750: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  p_bio, statePtr-
a760: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f  >p_bio);.    BIO
a770: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74  _set_ssl(statePt
a780: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72  r->bio, statePtr
a790: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  ->ssl, BIO_NOCLO
a7a0: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  SE);..    /*.   
a7b0: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49    * End of SSL I
a7c0: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nit.     */.    
a7d0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
a7e0: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ng %s", Tcl_GetC
a7f0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
a800: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
a810: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
a820: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20  nterp, (char *) 
a830: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
a840: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
a850: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
a860: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
a870: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
a880: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
a890: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
a8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
a8e0: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  . * UnimportObjC
a8f0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
a900: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
a910: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  voked to remove 
a920: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
a930: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20  nel filter.. *. 
a940: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
a950: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
a960: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
a970: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
a980: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76  modify the behav
a990: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61  ior of an IO cha
a9a0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
a9f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e  */.static int.Un
aa00: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69  importObjCmd(Cli
aa10: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
aa20: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
aa30: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
aa40: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
aa50: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
aa60: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
aa70: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
aa80: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
aa90: 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e  n. */..    dprin
aaa0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
aab0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
aac0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
aad0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
aae0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
aaf0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
ab00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
ab10: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
ab20: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
ab30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ab40: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
ab50: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
ab60: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
ab70: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
ab80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
ab90: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
aba0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
abb0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
abc0: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
abd0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
abe0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20  (chan);..    if 
abf0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
ac00: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
ac10: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
ac20: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
ac30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
ac40: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
ac50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
ac60: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
ac70: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
ac80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
ac90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
aca0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   }..    if (Tcl_
acb0: 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  UnstackChannel(i
acc0: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20  nterp, chan) == 
acd0: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65  TCL_ERROR) {..re
ace0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
acf0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
ad00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
ad10: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
ad20: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad70: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20  . *. * CTX_Init 
ad80: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53  -- construct a S
ad90: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a  SL_CTX instance.
ada0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
adb0: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54  *.A valid SSL_CT
adc0: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55  X instance or NU
add0: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  LL.. *. * Side e
ade0: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
adf0: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78  ructs SSL contex
ae00: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d  t (CTX). *. *---
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae50: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f  . */.static SSL_
ae60: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53  CTX *.CTX_Init(S
ae70: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
ae80: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e  int isServer, in
ae90: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b  t proto, char *k
aea0: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65  eyfile, char *ce
aeb0: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69  rtfile,.    unsi
aec0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20  gned char *key, 
aed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
aee0: 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  ert, int key_len
aef0: 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20  , int cert_len, 
af00: 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20  char *CAdir,.   
af10: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63   char *CAfile, c
af20: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68  har *ciphers, ch
af30: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
af40: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61  , int level, cha
af50: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20  r *DHparams) {. 
af60: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
af70: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72  nterp = statePtr
af80: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53  ->interp;.    SS
af90: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
afa0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
afb0: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44  ng ds;.    Tcl_D
afc0: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20  String ds1;.    
afd0: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20  int off = 0;.   
afe0: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74   int load_privat
aff0: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74  e_key;.    const
b000: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74   SSL_METHOD *met
b010: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  hod;..    dprint
b020: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
b030: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a    if (!proto) {.
b040: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b050: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61  t(interp, "no va
b060: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  lid protocol sel
b070: 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ected", NULL);..
b080: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
b090: 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74   }..    /* creat
b0a0: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
b0b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
b0c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
b0d0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
b0e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
b0f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
b100: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69  L_NO_SSL2).    i
b110: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
b120: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
b130: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
b140: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b150: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL2 protocol no
b160: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
b170: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
b180: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
b190: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
b1a0: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
b1b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
b1c0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
b1d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
b1e0: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL3)) {..Tcl_
b1f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b200: 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f  erp, "SSL3 proto
b210: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
b220: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
b230: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
b240: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
b250: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
b260: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
b270: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
b280: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
b290: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
b2a0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b2b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
b2c0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
b2d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
b2e0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
b2f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
b300: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
b310: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
b320: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b330: 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _1).    if (ENAB
b340: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
b350: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a  ROTO_TLS1_1)) {.
b360: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b370: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
b380: 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .1 protocol not 
b390: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
b3a0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
b3b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
b3c0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
b3d0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
b3e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
b3f0: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
b400: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
b410: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09  OTO_TLS1_2)) {..
b420: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b430: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
b440: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
b450: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
b460: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
b470: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
b480: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
b490: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
b4a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
b4b0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
b4c0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
b4d0: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
b4e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b4f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
b500: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
b510: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
b520: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
b530: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
b540: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20   switch (proto) 
b550: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
b560: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
b570: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
b580: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
b590: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
b5a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
b5b0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
b5c0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  SSL2:..method = 
b5d0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32  isServer ? SSLv2
b5e0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
b5f0: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f   : SSLv2_client_
b600: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
b610: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
b620: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
b630: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
b640: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
b650: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
b660: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
b670: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
b680: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64  TO_SSL3:..method
b690: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
b6a0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv3_server_metho
b6b0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65  d() : SSLv3_clie
b6c0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
b6d0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
b6e0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
b6f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
b700: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
b710: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
b720: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
b730: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
b740: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74  PROTO_TLS1:..met
b750: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
b760: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65   TLSv1_server_me
b770: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63  thod() : TLSv1_c
b780: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
b790: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
b7a0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
b7b0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
b7c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
b7d0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
b7e0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
b7f0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
b800: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
b810: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_1:..method =
b820: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
b830: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_1_server_metho
b840: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c  d() : TLSv1_1_cl
b850: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
b860: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
b870: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
b880: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
b890: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
b8a0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
b8b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b8c0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _2_METHOD).    c
b8d0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
b8e0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_2:..method = 
b8f0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
b900: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _2_server_method
b910: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69  () : TLSv1_2_cli
b920: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
b930: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
b940: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
b950: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
b960: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b970: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  _3).    case TLS
b980: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09  _PROTO_TLS1_3:..
b990: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72  /* Use the gener
b9a0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f  ic method and co
b9b0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61  nstraint range a
b9c0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20  fter context is 
b9d0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68  created */..meth
b9e0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
b9f0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
ba00: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
ba10: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
ba20: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
ba30: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74  fault:../* Negot
ba40: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61  iate highest ava
ba50: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76  ilable SSL/TLS v
ba60: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f  ersion */..metho
ba70: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
ba80: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
ba90: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
baa0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50  method();.#if OP
bab0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
bac0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
bad0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
bae0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
baf0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
bb00: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL2)..off |= (EN
bb10: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
bb20: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f  _PROTO_SSL2)   ?
bb30: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
bb40: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv2);.#endif.#i
bb50: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
bb60: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
bb70: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
bb80: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
bb90: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
bba0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
bbb0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
bbc0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
bbd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
bbe0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
bbf0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66  SSL_NO_TLS1)..of
bc00: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
bc10: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
bc20: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  LS1)   ? 0 : SSL
bc30: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23  _OP_NO_TLSv1);.#
bc40: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
bc50: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
bc60: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
bc70: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66  L_NO_TLS1_1)..of
bc80: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
bc90: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
bca0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_1) ? 0 : SSL
bcb0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b  _OP_NO_TLSv1_1);
bcc0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
bcd0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
bce0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
bcf0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09  SSL_NO_TLS1_2)..
bd00: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
bd10: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
bd20: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53  _TLS1_2) ? 0 : S
bd30: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32  SL_OP_NO_TLSv1_2
bd40: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
bd50: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
bd60: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
bd70: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
bd80: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
bd90: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
bda0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a  TO_TLS1_3) ? 0 :
bdb0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
bdc0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65  _3);.#endif..bre
bdd0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  ak;.    }..    E
bde0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
bdf0: 3b 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ;.    ctx = SSL_
be00: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b  CTX_new(method);
be10: 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20  ..    if (!ctx) 
be20: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  {..return(NULL);
be30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
be40: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47  getenv(SSLKEYLOG
be50: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54  FILE)) {..SSL_CT
be60: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c  X_set_keylog_cal
be70: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f  lback(ctx, KeyLo
be80: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  gCallback);.    
be90: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
bea0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
beb0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
bec0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
bed0: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50   (proto == TLS_P
bee0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09  ROTO_TLS1_3) {..
bef0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
bf00: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
bf10: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
bf20: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  N);..SSL_CTX_set
bf30: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
bf40: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
bf50: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23  ERSION);.    }.#
bf60: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f  endif..    /* Fo
bf70: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63  rce cipher selec
bf80: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65  tion order by se
bf90: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  rver */.    if (
bfa0: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53  !isServer) {..SS
bfb0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
bfc0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49  s(ctx, SSL_OP_CI
bfd0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46  PHER_SERVER_PREF
bfe0: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a  ERENCE);.    }..
bff0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c000: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76  app_data(ctx, (v
c010: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a  oid*)interp);./*
c020: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e   remember the in
c030: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20  terpreter */.   
c040: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
c050: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
c060: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53  _ALL);./* all SS
c070: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
c080: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
c090: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
c0a0: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61  , off);../* disa
c0b0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72  ble protocol ver
c0c0: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45  sions */.#if OPE
c0d0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
c0e0: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30  BER < 0x10101000
c0f0: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  L.    SSL_CTX_se
c100: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f  t_mode(ctx, SSL_
c110: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29  MODE_AUTO_RETRY)
c120: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20  ;./* handle new 
c130: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61  handshakes in ba
c140: 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20  ckground. On by 
c150: 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53  default in OpenS
c160: 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e  SL 1.1.1. */.#en
c170: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  dif.    SSL_CTX_
c180: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73  sess_set_cache_s
c190: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a  ize(ctx, 128);..
c1a0: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20      /* Set user 
c1b0: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c  defined ciphers,
c1c0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20   cipher suites, 
c1d0: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76  and security lev
c1e0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63  el */.    if ((c
c1f0: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20  iphers != NULL) 
c200: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  && !SSL_CTX_set_
c210: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c  cipher_list(ctx,
c220: 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 20 20   ciphers)) {..  
c230: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c240: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
c250: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20  ciphers failed: 
c260: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
c270: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
c280: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
c290: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
c2a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
c2b0: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
c2c0: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
c2d0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
c2e0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
c2f0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
c300: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
c310: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c320: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73  p, "Set cipher s
c330: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f  uites failed: No
c340: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
c350: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
c360: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
c370: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
c380: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
c390: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63  ..    /* Set sec
c3a0: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20  urity level */. 
c3b0: 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d     if (level > -
c3c0: 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20  1 && level < 6) 
c3d0: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
c3e0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a  curity_level */.
c3f0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63  .SSL_CTX_set_sec
c400: 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c  urity_level(ctx,
c410: 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a   level);.    }..
c420: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20      /* set some 
c430: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20  callbacks */.   
c440: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
c450: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63  ault_passwd_cb(c
c460: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  tx, PasswordCall
c470: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43  back);.    SSL_C
c480: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
c490: 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74  asswd_cb_userdat
c4a0: 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73  a(ctx, (void *)s
c4b0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
c4c0: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d  * read a Diffie-
c4d0: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65  Hellman paramete
c4e0: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20  rs file, or use 
c4f0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65  the built-in one
c500: 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53   */.#ifdef OPENS
c510: 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20  SL_NO_DH.    if 
c520: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
c530: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
c540: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c550: 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70  DH parameter sup
c560: 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62  port not availab
c570: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
c580: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
c590: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
c5a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c   NULL;.    }.#el
c5b0: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68  se.    {..DH* dh
c5c0: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20  ;..if (DHparams 
c5d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c5e0: 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54  BIO *bio;..    T
c5f0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
c600: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20  ds);..    bio = 
c610: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e  BIO_new_file(F2N
c620: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c  (DHparams, &ds),
c630: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28   "r");..    if (
c640: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53  !bio) {...Tcl_DS
c650: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
c660: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c670: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
c680: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61  d not find DH pa
c690: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20  rameters file", 
c6a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c6b0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
c6c0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
c6d0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  LL;..    }...   
c6e0: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62   dh = PEM_read_b
c6f0: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c  io_DHparams(bio,
c700: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
c710: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65  L);..    BIO_fre
c720: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c  e(bio);..    Tcl
c730: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
c740: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29  );..    if (!dh)
c750: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
c760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
c770: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48  ould not read DH
c780: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d   parameters from
c790: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
c7a0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
c7b0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
c7c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
c7d0: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20   }..} else {..  
c7e0: 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72    dh = get_dhPar
c7f0: 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43  ams();..}..SSL_C
c800: 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74  TX_set_tmp_dh(ct
c810: 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65  x, dh);..DH_free
c820: 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  (dh);.    }.#end
c830: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f  if..    /* set o
c840: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  ur certificate *
c850: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61  /.    load_priva
c860: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  te_key = 0;.    
c870: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20  if (certfile != 
c880: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
c890: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a  ivate_key = 1;..
c8a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74  .Tcl_DStringInit
c8b0: 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c  (&ds);...if (SSL
c8c0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
c8d0: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46  cate_file(ctx, F
c8e0: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73  2N(certfile, &ds
c8f0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
c900: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
c910: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
c920: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
c930: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c940: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
c950: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
c960: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
c970: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20  e, ": ",....    
c980: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
c990: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
c9a0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
c9b0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
c9c0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
c9d0: 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e  se if (cert != N
c9e0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
c9f0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69  vate_key = 1;..i
ca00: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
ca10: 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28  ertificate_ASN1(
ca20: 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63  ctx, cert_len, c
ca30: 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  ert) <= 0) {..  
ca40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
ca50: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
ca60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ca70: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
ca80: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
ca90: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41  : ",....     REA
caa0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
cab0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
cac0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
cad0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
cae0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
caf0: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68  ..certfile = (ch
cb00: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66  ar*)X509_get_def
cb10: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29  ault_cert_file()
cb20: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
cb30: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
cb40: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69  file(ctx, certfi
cb50: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  le, SSL_FILETYPE
cb60: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69  _PEM) <= 0) {.#i
cb70: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  f 0..    Tcl_DSt
cb80: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
cb90: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
cba0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
cbb0: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
cbc0: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
cbd0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
cbe0: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
cbf0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
cc00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
cc10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
cc20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
cc30: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20  LL;.#endif..}.  
cc40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
cc50: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20  our private key 
cc60: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f  */.    if (load_
cc70: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09  private_key) {..
cc80: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
cc90: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55  ULL && key == NU
cca0: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69  LL) {..    keyfi
ccb0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
ccc0: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20  }...if (keyfile 
ccd0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
cce0: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61  /* get the priva
ccf0: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  te key associate
cd00: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74  d with this cert
cd10: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
cd20: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
cd30: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65  ULL) {...keyfile
cd40: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20   = certfile;..  
cd50: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53    }...    if (SS
cd60: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
cd70: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46  eKey_file(ctx, F
cd80: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29  2N(keyfile, &ds)
cd90: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
cda0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  EM) <= 0) {...Tc
cdb0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
cdc0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
cdd0: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
cde0: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
cdf0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
ce00: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
ce10: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
ce20: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
ce30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ce40: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
ce50: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
ce60: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69  ey file ", keyfi
ce70: 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20  le, " ",....    
ce80: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
ce90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
cea0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
ceb0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
cec0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  L;..    }..    T
ced0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
cee0: 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66  ds);...} else if
cef0: 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b   (key != NULL) {
cf00: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54  ..    if (SSL_CT
cf10: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
cf20: 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52  _ASN1(EVP_PKEY_R
cf30: 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79  SA, ctx, key,key
cf40: 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _len) <= 0) {...
cf50: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
cf60: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
cf70: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
cf80: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
cf90: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
cfa0: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
cfb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
cfc0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
cfd0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cfe0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
cff0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
d000: 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28   key: ", REASON(
d010: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
d020: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
d030: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
d040: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d   NULL;..    }..}
d050: 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77  ../* Now we know
d060: 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20   that a key and 
d070: 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73  cert have been s
d080: 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74  et against.. * t
d090: 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  he SSL context *
d0a0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f  /..if (!SSL_CTX_
d0b0: 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65  check_private_ke
d0c0: 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54  y(ctx)) {..    T
d0d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d0e0: 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65  interp, "private
d0f0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
d100: 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63  tch the certific
d110: 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c  ate public key",
d120: 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a  ....     (char *
d130: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
d140: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
d150: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
d160: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  L;..}.    }..   
d170: 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61   /* Set verifica
d180: 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20  tion CAs */.    
d190: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
d1a0: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  &ds);.    Tcl_DS
d1b0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
d1c0: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
d1d0: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f  X_load_verify_lo
d1e0: 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e  cations(ctx, F2N
d1f0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46  (CAfile, &ds), F
d200: 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29  2N(CAdir, &ds1))
d210: 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65   ||..!SSL_CTX_se
d220: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79  t_default_verify
d230: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23  _paths(ctx)) {.#
d240: 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e  if 0..Tcl_DStrin
d250: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c  gFree(&ds);..Tcl
d260: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
d270: 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75  1);../* Don't cu
d280: 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20  rrently care if 
d290: 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54  this fails */..T
d2a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d2b0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66  interp, "SSL def
d2c0: 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68  ault verify path
d2d0: 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  s: ", REASON(), 
d2e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d2f0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
d300: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
d310: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
d320: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73      /* https://s
d330: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70  ourceforge.net/p
d340: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f  /tls/bugs/57/ */
d350: 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f  .    /* XXX:TODO
d360: 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73  : Let the user s
d370: 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72  upply values her
d380: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d  e instead of som
d390: 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73  ething that exis
d3a0: 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79  ts on the filesy
d3b0: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28  stem */.    if (
d3c0: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
d3d0: 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39  {..STACK_OF(X509
d3e0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65  _NAME) *certName
d3f0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69  s = SSL_load_cli
d400: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28  ent_CA_file(F2N(
d410: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09  CAfile, &ds));..
d420: 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d  if (certNames !=
d430: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53   NULL) {..    SS
d440: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
d450: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65  _CA_list(ctx, ce
d460: 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20  rtNames);..}.   
d470: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
d480: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20  ingFree(&ds);.  
d490: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
d4a0: 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74  e(&ds1);.    ret
d4b0: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn ctx;.}.../*.
d4c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74  -----. *. * Stat
d510: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  usObjCmd -- retu
d520: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66  rn certificate f
d530: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65  or connected pee
d540: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
d550: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
d560: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
d570: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d580: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
d5e0: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c  .StatusObjCmd(Cl
d5f0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
d600: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
d610: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
d620: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
d630: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
d640: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
d650: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
d660: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
d670: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
d680: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
d690: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
d6a0: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
d6b0: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63   int mode;.    c
d6c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
d6d0: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75  ar *proto;.    u
d6e0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b  nsigned int len;
d6f0: 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20  .    int nid;.. 
d700: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
d710: 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63  ed");..    switc
d720: 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65  h (objc) {..case
d730: 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c   2:..    channel
d740: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
d750: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
d760: 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  [1], NULL);..   
d770: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33   break;...case 3
d780: 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63  :..    if (!strc
d790: 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  mp (Tcl_GetStrin
d7a0: 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  g (objv[1]), "-l
d7b0: 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e  ocal")) {...chan
d7c0: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
d7d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
d7e0: 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09  bjv[2], NULL);..
d7f0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09  .break;..    }..
d800: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
d810: 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a  -through ... */.
d820: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e  #if defined(__GN
d830: 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74  UC__)..    __att
d840: 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68  ribute__((fallth
d850: 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a  rough));.#endif.
d860: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54  .default:..    T
d870: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d880: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
d890: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e   "?-local? chann
d8a0: 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72  el");..    retur
d8b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d8c0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
d8d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
d8e0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  terp, channelNam
d8f0: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  e, &mode);.    i
d900: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
d910: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
d920: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d930: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  OR;.    }.    /*
d940: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
d950: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
d960: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
d970: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
d980: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
d990: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
d9a0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
d9b0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
d9c0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
d9d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d9e0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
d9f0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
da00: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
da10: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
da20: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
da30: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
da40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
da50: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
da60: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
da70: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
da80: 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  a(chan);.    if 
da90: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70  (objc == 2) {..p
daa0: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  eer = SSL_get_pe
dab0: 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  er_certificate(s
dac0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
dad0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65     } else {..pee
dae0: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74  r = SSL_get_cert
daf0: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
db00: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
db10: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
db20: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
db30: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
db40: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
db50: 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 65  == 2) { X509_fre
db60: 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d  e(peer); }.    }
db70: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
db80: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
db90: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
dba0: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65  ..    /* Peer ce
dbb0: 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74  rt chain (client
dbc0: 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54   only) */.    ST
dbd0: 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73  ACK_OF(X509)* ss
dbe0: 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65  l_certs = SSL_ge
dbf0: 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69  t_peer_cert_chai
dc00: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
dc10: 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 20  ;.    if (!peer 
dc20: 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d  && (ssl_certs ==
dc30: 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39   NULL || sk_X509
dc40: 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 20  _num(ssl_certs) 
dc50: 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e  == 0)) {..return
dc60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dc70: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e  }..    /* Peer n
dc80: 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a 2f  ame from cert */
dc90: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
dca0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
dcb0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
dcc0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
dcd0: 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b  peername", -1));
dce0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
dcf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
dd00: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
dd10: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
dd20: 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
dd30: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
dd40: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
dd50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
dd60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
dd70: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
dd80: 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d  ngObj("sbits", -
dd90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
dda0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ddb0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
ddc0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
ddd0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62  SSL_get_cipher_b
dde0: 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  its(statePtr->ss
ddf0: 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20  l, NULL)));..   
de00: 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72   ciphers = (char
de10: 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  *)SSL_get_cipher
de20: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
de30: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
de40: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73  s != NULL) && (s
de50: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22  trcmp(ciphers, "
de60: 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20  (NONE)") != 0)) 
de70: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
de80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
de90: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
dea0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69  NewStringObj("ci
deb0: 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63  pher", -1));..Tc
dec0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ded0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
dee0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
def0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
df00: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
df10: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20  >ssl), -1));.   
df20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66   }..    /* Verif
df30: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69  y the X509 certi
df40: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64  ficate presented
df50: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a   by the peer */.
df60: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
df70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
df80: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
df90: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76  _NewStringObj("v
dfa0: 65 72 69 66 69 63 61 74 69 6f 6e 22 2c 20 2d 31  erification", -1
dfb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
dfc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
dfd0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
dfe0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
dff0: 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f 63  bj(X509_verify_c
e000: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
e010: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
e020: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
e030: 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20  >ssl)), -1));.. 
e040: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
e050: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
e060: 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
e070: 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
e080: 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
e090: 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
e0a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
e0b0: 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
e0c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
e0d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
e0e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
e0f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
e100: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
e110: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e120: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
e130: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
e140: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
e150: 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e  proto, (int) len
e160: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
e170: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e180: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e190: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e1a0: 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31  j("protocol", -1
e1b0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
e1c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e1d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e1e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e1f0: 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  j(SSL_get_versio
e200: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
e210: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
e220: 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53  Valid for non-RS
e230: 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20  A signature and 
e240: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 54  TLS 1.3 */.    T
e250: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e260: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e270: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e280: 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74  tringObj("signat
e290: 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
e2a0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20  ", -1));.    if 
e2b0: 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c  (objc == 2 ? SSL
e2c0: 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
e2d0: 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
e2e0: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53  ->ssl, &nid) : S
e2f0: 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
e300: 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
e310: 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63  sl, &nid)) {..Tc
e320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e330: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
e340: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
e350: 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32  ringObj(OBJ_nid2
e360: 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20  ln(nid), -1));. 
e370: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
e380: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e390: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e3a0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e3b0: 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b  ingObj("", -1));
e3c0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c  .    }.    Tcl_L
e3d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e3e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
e3f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
e400: 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 5f  gObj("signature_
e410: 74 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  type", -1));.   
e420: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f   if (objc == 2 ?
e430: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
e440: 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
e450: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
e460: 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f  &nid) : SSL_get_
e470: 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
e480: 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
e490: 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f  , &nid)) {..Tcl_
e4a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e4b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e4c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e4d0: 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e  ngObj(OBJ_nid2ln
e4e0: 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20  (nid), -1));.   
e4f0: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c   } else {..Tcl_L
e500: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e510: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
e520: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
e530: 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20  gObj("", -1));. 
e540: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65     }..    Tcl_Se
e550: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e560: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
e570: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
e580: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
e590: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
e5a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
e5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
e5f0: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
e600: 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
e610: 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
e620: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
e630: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
e640: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
e650: 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
e660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
e6a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
e6b0: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
e6c0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
e6d0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
e6e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
e6f0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
e700: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
e710: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
e720: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
e730: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
e740: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
e750: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
e760: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
e770: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
e780: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
e790: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f   *objPtr;.    co
e7a0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
e7b0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
e7c0: 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
e7d0: 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
e7e0: 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
e7f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
e800: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
e810: 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20  long mode;..    
e820: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
e830: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
e840: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
e850: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
e860: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
e870: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  R);.    }..    c
e880: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
e890: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
e8a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e8b0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
e8c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
e8d0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
e8e0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
e8f0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
e900: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e910: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
e920: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
e930: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
e940: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
e950: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
e960: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
e970: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
e980: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
e990: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
e9a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e9b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
e9c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
e9d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
e9e0: 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ), "\": not a TL
e9f0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
ea00: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
ea10: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
ea20: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
ea30: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
ea40: 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
ea50: 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
ea60: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
ea70: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
ea80: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
ea90: 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
eaa0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
eab0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
eac0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
ead0: 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
eae0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
eaf0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
eb00: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
eb10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61  ewStringObj("sta
eb20: 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  te", -1));..Tcl_
eb30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
eb40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
eb50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
eb60: 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f  ngObj(SSL_state_
eb70: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29  string_long(ssl)
eb80: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  , -1));.../* Get
eb90: 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
eba0: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54  erver name */..T
ebb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ebc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ebd0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
ebe0: 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72  tringObj("server
ebf0: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  name", -1));..Tc
ec00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ec10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
ec20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ec30: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
ec40: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
ec50: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
ec60: 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29  host_name), -1))
ec70: 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
ec80: 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  col */..Tcl_List
ec90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
eca0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
ecb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ecc0: 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31  j("protocol", -1
ecd0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
ece0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ecf0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
ed00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
ed10: 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
ed20: 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  sl), -1));.../* 
ed30: 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
ed40: 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69  lowed */..Tcl_Li
ed50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ed60: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ed70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ed80: 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69  Obj("renegotiati
ed90: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
eda0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
edb0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
edc0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
edd0: 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f  ngObj(..    SSL_
ede0: 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67  get_secure_reneg
edf0: 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74  otiation_support
ee00: 28 73 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 74  (ssl) ? "support
ee10: 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f  ed" : "not suppo
ee20: 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f  rted", -1));.../
ee30: 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Get security l
ee40: 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  evel */..Tcl_Lis
ee50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ee60: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
ee70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ee80: 62 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76 65  bj("securityleve
ee90: 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  l", -1));..Tcl_L
eea0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
eeb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
eec0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
eed0: 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69  j(SSL_get_securi
eee0: 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b  ty_level(ssl)));
eef0: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e  .../* Session in
ef00: 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  fo */..Tcl_ListO
ef10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ef20: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ef30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ef40: 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  ("session_reused
ef50: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
ef60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ef70: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ef80: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
ef90: 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e  nObj(SSL_session
efa0: 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a  _reused(ssl)));.
efb0: 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69  ../* Is server i
efc0: 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  nfo */..Tcl_List
efd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
efe0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
eff0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f000: 6a 28 22 69 73 5f 73 65 72 76 65 72 22 2c 20 2d  j("is_server", -
f010: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f020: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f030: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f040: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
f050: 28 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73  (SSL_is_server(s
f060: 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  sl)));.    }..  
f070: 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f    /* Cipher info
f080: 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d   */.    cipher =
f090: 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
f0a0: 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20  _cipher(ssl);.  
f0b0: 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20    if (cipher != 
f0c0: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
f0d0: 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b  f[BUFSIZ] = {0};
f0e0: 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f  ..int bits, alg_
f0f0: 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74  bits;...Tcl_List
f100: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f110: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f120: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f130: 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29  j("cipher", -1))
f140: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
f150: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f160: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f170: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
f180: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
f190: 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a  (cipher), -1));.
f1a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f1b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f1c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f1d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e  wStringObj("stan
f1e0: 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29  dard_name", -1))
f1f0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
f200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f210: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f220: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
f230: 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
f240: 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
f250: 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53  1));...bits = SS
f260: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74  L_CIPHER_get_bit
f270: 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62  s(cipher, &alg_b
f280: 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  its);..Tcl_ListO
f290: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f2a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f2b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f2c0: 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09  ("bits", -1));..
f2d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f2e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f2f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f300: 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09  IntObj(bits));..
f310: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f320: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f330: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f340: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65  StringObj("secre
f350: 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09  t_bits", -1));..
f360: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f370: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f380: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f390: 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29  IntObj(alg_bits)
f3a0: 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20  );../* alg_bits 
f3b0: 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65  is actual key se
f3c0: 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73  cret bits. If us
f3d0: 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65  e bits and secre
f3e0: 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69  t (algorithm) bi
f3f0: 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 20  ts differ,.     
f400: 20 20 20 20 20 20 74 68 65 20 72 65 73 74 20 6f        the rest o
f410: 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66  f the bits are f
f420: 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c  ixed, i.e. for l
f430: 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69  imited export ci
f440: 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36  phers (bits < 56
f450: 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ) */..Tcl_ListOb
f460: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f470: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f480: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f490: 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d  "min_version", -
f4a0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f4b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f4c0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f4d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f4e0: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76  SSL_CIPHER_get_v
f4f0: 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20  ersion(cipher), 
f500: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f  -1));.../* Get O
f510: 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20  penSSL-specific 
f520: 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20  ID, not IANA ID 
f530: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
f540: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f550: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
f560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69  _NewStringObj("i
f570: 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  d", -1));..Tcl_L
f580: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f590: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f5a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
f5b0: 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48  j((int) SSL_CIPH
f5c0: 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72  ER_get_id(cipher
f5d0: 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  )));...if (SSL_C
f5e0: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
f5f0: 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73  n(cipher, buf, s
f600: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
f610: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
f620: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f630: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
f640: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
f650: 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69  ngObj("descripti
f660: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  on", -1));..    
f670: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f680: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f690: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f6a0: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d  StringObj(buf, -
f6b0: 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  1));..}.    }.. 
f6c0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e     /* Session in
f6d0: 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  fo */.    sessio
f6e0: 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73  n = SSL_get_sess
f6f0: 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  ion(ssl);.    if
f700: 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c   (session != NUL
f710: 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
f720: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
f730: 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b  t;..size_t len2;
f740: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  ..unsigned int u
f750: 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len;..const unsi
f760: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
f770: 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 66  on_id;..char buf
f780: 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54  fer[SSL_MAX_MAST
f790: 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a  ER_KEY_LENGTH];.
f7a0: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
f7b0: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
f7c0: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
f7d0: 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69   the ALPN negoti
f7e0: 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45  ation */..SSL_SE
f7f0: 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f  SSION_get0_alpn_
f800: 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e  selected(session
f810: 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29  , &proto, &len2)
f820: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
f830: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f840: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f850: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
f860: 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  pn", -1));..Tcl_
f870: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f880: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
f890: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
f8a0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72  ngObj((char *)pr
f8b0: 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  oto, (int) len2)
f8c0: 29 3b 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  );.../* Resumabl
f8d0: 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63  e session */..Tc
f8e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f8f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f900: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f910: 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62  ringObj("resumab
f920: 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  le", -1));..Tcl_
f930: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f940: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
f950: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
f960: 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69  bj(SSL_SESSION_i
f970: 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73  s_resumable(sess
f980: 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  ion)));.../* Ses
f990: 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20  sion start time 
f9a0: 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65  (seconds since e
f9b0: 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69  poch) */..Tcl_Li
f9c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f9d0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
f9e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f9f0: 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22  Obj("start_time"
fa00: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fa10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fa20: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fa30: 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
fa40: 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  (SSL_SESSION_get
fa50: 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29  _time(session)))
fa60: 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76  ;.../* Timeout v
fa70: 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67  alue - SSL_CTX_g
fa80: 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73  et_timeout (in s
fa90: 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f  econds) */..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 53 74 72 69  Ptr, Tcl_NewStri
fad0: 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c  ngObj("timeout",
fae0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
faf0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fb00: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fb10: 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28   Tcl_NewLongObj(
fb20: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
fb30: 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
fb40: 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
fb50: 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65   ticket lifetime
fb60: 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64   hint (in second
fb70: 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  s) */..Tcl_ListO
fb80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fb90: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fba0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
fbb0: 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29  ("lifetime", -1)
fbc0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
fbd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fbe0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fbf0: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f  _NewLongObj(SSL_
fc00: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b  SESSION_get_tick
fc10: 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74  et_lifetime_hint
fc20: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
fc30: 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  * Session id */.
fc40: 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53  .session_id = SS
fc50: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64  L_SESSION_get_id
fc60: 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
fc70: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
fc80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
fc90: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
fca0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
fcb0: 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29 3b  ssion_id", -1));
fcc0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
fcd0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
fce0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
fcf0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
fd00: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29  ession_id, (int)
fd10: 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65   ulen));.../* Se
fd20: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63  ssion ticket - c
fd30: 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53  lient only */..S
fd40: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
fd50: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
fd60: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
fd70: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
fd80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
fd90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
fda0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
fdb0: 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31  sion_ticket", -1
fdc0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
fdd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fde0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
fdf0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
fe00: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20  j(ticket, (int) 
fe10: 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63  len2));.../* Tic
fe20: 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a  ket app data */.
fe30: 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
fe40: 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61  0_ticket_appdata
fe50: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
fe60: 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f  t, &len2);..Tcl_
fe70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fe80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fe90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
fea0: 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 70  ngObj("ticket_ap
feb0: 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09  p_data", -1));..
fec0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fed0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fee0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
fef0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
ff00: 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  ket, (int) len2)
ff10: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74  );.../* Get mast
ff20: 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20  er key */..len2 
ff30: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
ff40: 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73  t_master_key(ses
ff50: 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53  sion, buffer, SS
ff60: 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
ff70: 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c  _LENGTH);..Tcl_L
ff80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ff90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
ffa0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
ffb0: 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79  gObj("master_key
ffc0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
ffd0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ffe0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fff0: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
10000 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 28  rayObj(buffer, (
10010 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20  int) len2));.   
10020 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
10030 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
10040 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
10050 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
10060 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
10070 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
10080 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
10090 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
100a0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
100b0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
100c0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
100d0 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
100e0 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  sl);...Tcl_ListO
100f0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10100 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10110 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10120 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20  ("compression", 
10130 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
10140 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10150 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10160 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10170 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50  (comp ? SSL_COMP
10180 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
10190 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  : "NONE", -1));.
101a0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
101b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
101c0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
101d0 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61  wStringObj("expa
101e0 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  nsion", -1));..T
101f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10200 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10210 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10220 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20  tringObj(expn ? 
10230 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
10240 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22  e(expn) : "NONE"
10250 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54  , -1));.#else..T
10260 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10270 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10280 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10290 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65  tringObj("compre
102a0 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  ssion", -1));..T
102b0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
102c0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
102d0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
102e0 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c  tringObj("NONE",
102f0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
10300 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10310 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10320 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10330 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d  j("expansion", -
10340 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
10350 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10360 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10370 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10380 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65  "NONE", -1));.#e
10390 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
103a0 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
103b0 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c  /.    mode = SSL
103c0 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e  _CTX_get_session
103d0 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74  _cache_mode(stat
103e0 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
103f0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
10400 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
10410 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b  ..proto = "off";
10420 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
10430 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
10440 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
10450 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74  .proto = "client
10460 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
10470 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
10480 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
10490 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76  {..proto = "serv
104a0 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
104b0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
104c0 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20  ESS_CACHE_BOTH) 
104d0 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68  {..proto = "both
104e0 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
104f0 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77  .proto = "unknow
10500 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  n";.    }.    Tc
10510 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10520 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10530 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10540 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
10550 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31  _cache_mode", -1
10560 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
10570 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10580 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10590 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
105a0 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a  j(proto, -1));..
105b0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
105c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
105d0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
105e0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
105f0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
10600 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
10610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10650 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a   *. * VersionObj
10660 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65  Cmd -- return ve
10670 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f  rsion string fro
10680 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
10690 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
106a0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
106b0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
106c0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
106d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10710 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
10720 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e  atic int.Version
10730 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
10740 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
10750 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10760 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
10770 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
10780 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ]) {.    Tcl_Obj
10790 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64   *objPtr;..    d
107a0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
107b0 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
107c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
107d0 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
107e0 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20  _TEXT, -1);.    
107f0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10800 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
10810 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
10820 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
10830 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
10840 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f  .objc = objc;..o
10850 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a  bjv = objv;.}...
10860 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d  --------. *. * M
108b0 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73  iscObjCmd -- mis
108c0 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  c commands. *. *
108d0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
108e0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
108f0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
10900 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
10910 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
10960 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a  atic int.MiscObj
10970 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
10980 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
10990 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
109a0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
109b0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
109c0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
109d0 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64  st char *command
109e0 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20  s [] = { "req", 
109f0 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d  "strreq", NULL }
10a00 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61  ;.    enum comma
10a10 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54  nd { C_REQ, C_ST
10a20 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b  RREQ, C_DUMMY };
10a30 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73  .    int cmd, is
10a40 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75  Str;.    char bu
10a50 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20  ffer[16384];..  
10a60 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10a70 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
10a80 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
10a90 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10aa0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75  rp, 1, objv, "su
10ab0 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22  bcommand ?args?"
10ac0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
10ad0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10ae0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
10af0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10b00 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64  objv[1], command
10b10 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  s, "command", 0,
10b20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  &cmd) != TCL_OK)
10b30 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
10b40 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
10b50 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d   isStr = (cmd ==
10b60 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20   C_STRREQ);.    
10b70 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f  switch ((enum co
10b80 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63  mmand) cmd) {..c
10b90 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65  ase C_REQ:..case
10ba0 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20   C_STRREQ: {..  
10bb0 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79    EVP_PKEY *pkey
10bc0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
10bd0 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20   *cert=NULL;..  
10be0 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d    X509_NAME *nam
10bf0 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c  e=NULL;..    Tcl
10c00 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20  _Obj **listv;.. 
10c10 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a     int listc,i;.
10c20 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e  ..    BIO *out=N
10c30 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20  ULL;...    char 
10c40 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22  *k_C="",*k_ST=""
10c50 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22  ,*k_L="",*k_O=""
10c60 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d  ,*k_OU="",*k_CN=
10c70 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a  "",*k_Email="";.
10c80 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75  .    char *keyou
10c90 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a  t,*pemout,*str;.
10ca0 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65  .    int keysize
10cb0 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33  ,serial=0,days=3
10cc0 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  65;..#if OPENSSL
10cd0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
10ce0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
10cf0 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d     BIGNUM *bne =
10d00 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20   NULL;..    RSA 
10d10 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c  *rsa = NULL;.#el
10d20 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59  se..    EVP_PKEY
10d30 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
10d40 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69  ;.#endif...    i
10d50 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28  f ((objc<5) || (
10d60 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c  objc>6)) {...Tcl
10d70 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10d80 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10d90 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20  keysize keyfile 
10da0 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22  certfile ?info?"
10db0 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
10dc0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09  ERROR;..    }...
10dd0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
10de0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
10df0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73  , objv[2], &keys
10e00 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ize) != TCL_OK) 
10e10 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  {...return TCL_E
10e20 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
10e30 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74    keyout=Tcl_Get
10e40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
10e50 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c  ..    pemout=Tcl
10e60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10e70 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73  4]);..    if (is
10e80 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  Str) {...Tcl_Set
10e90 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
10ea0 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53  t,"",0);...Tcl_S
10eb0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
10ec0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20  out,"",0);..    
10ed0 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63  }...    if (objc
10ee0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c  >=6) {...if (Tcl
10ef0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
10f00 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  nts(interp, objv
10f10 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20  [5],....&listc, 
10f20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
10f30 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
10f40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
10f50 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
10f60 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
10f70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10f80 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
10f90 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
10fa0 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
10fb0 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
10fc0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
10fd0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
10fe0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
10ff0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
11000 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
11010 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
11020 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
11030 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
11040 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
11050 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
11060 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
11070 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
11080 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11090 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
110a0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
110b0 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
110c0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
110d0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
110e0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
110f0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
11100 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11110 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
11120 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
11130 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
11140 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
11150 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
11160 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
11170 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
11180 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
11190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
111a0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
111b0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
111c0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
111d0 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
111e0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
111f0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
11200 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
11210 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
11220 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
11230 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
11240 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
11250 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
11260 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
11270 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11280 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11290 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
112a0 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
112b0 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
112c0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
112d0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
112e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
112f0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
11300 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
11310 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
11320 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
11330 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
11340 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
11350 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
11360 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
11370 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
11380 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
11390 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
113a0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
113b0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
113c0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
113d0 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
113e0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
113f0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
11400 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
11410 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
11420 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
11430 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
11440 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
11450 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
11460 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
11470 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
11480 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
11490 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
114a0 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
114b0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
114c0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
114d0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
114e0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
114f0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
11500 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
11510 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
11520 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
11530 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
11540 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
11550 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
11560 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
11570 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
11580 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
11590 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
115a0 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
115b0 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
115c0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
115d0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
115e0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
115f0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
11600 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
11610 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
11620 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
11630 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
11640 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
11650 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
11660 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
11670 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11680 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
11690 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
116a0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
116b0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
116c0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
116d0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
116e0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
116f0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
11700 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
11710 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
11720 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
11730 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
11740 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
11750 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
11760 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
11770 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
11780 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
11790 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
117a0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
117b0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
117c0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
117d0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
117e0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
117f0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
11800 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
11810 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
11820 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
11830 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
11840 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
11850 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
11860 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
11870 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
11880 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
11890 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
118a0 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
118b0 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
118c0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
118d0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
118e0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
118f0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
11900 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
11910 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
11920 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
11930 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
11940 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
11950 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
11960 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
11970 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
11980 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
11990 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76  .}....X509_set_v
119a0 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a  ersion(cert,2);.
119b0 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73  ..ASN1_INTEGER_s
119c0 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69  et(X509_get_seri
119d0 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73  alNumber(cert),s
119e0 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67  erial);...X509_g
119f0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
11a00 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65  etm_notBefore(ce
11a10 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67  rt),0);...X509_g
11a20 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
11a30 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72  etm_notAfter(cer
11a40 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32  t),(long)60*60*2
11a50 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f  4*days);...X509_
11a60 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c  set_pubkey(cert,
11a70 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58  pkey);....name=X
11a80 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f  509_get_subject_
11a90 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58  name(cert);....X
11aa0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
11ab0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
11ac0 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  C", MBSTRING_ASC
11ad0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
11ae0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d  d char *) k_C, -
11af0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
11b00 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
11b10 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54  _by_txt(name,"ST
11b20 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
11b30 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
11b40 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d   char *) k_ST, -
11b50 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
11b60 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
11b70 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22  _by_txt(name,"L"
11b80 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
11b90 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
11ba0 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c  char *) k_L, -1,
11bb0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
11bc0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
11bd0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20  y_txt(name,"O", 
11be0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
11bf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11c00 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d  ar *) k_O, -1, -
11c10 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
11c20 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
11c30 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d  txt(name,"OU", M
11c40 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
11c50 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11c60 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d  r *) k_OU, -1, -
11c70 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
11c80 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
11c90 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d  txt(name,"CN", M
11ca0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
11cb0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11cc0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d  r *) k_CN, -1, -
11cd0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
11ce0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
11cf0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22  txt(name,"Email"
11d00 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
11d10 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
11d20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c  char *) k_Email,
11d30 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09   -1, -1, 0);....
11d40 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74  X509_set_subject
11d50 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29  _name(cert,name)
11d60 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73  ;....if (!X509_s
11d70 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56  ign(cert,pkey,EV
11d80 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09  P_sha256())) {..
11d90 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63  .    X509_free(c
11da0 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f  ert);...    EVP_
11db0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
11dc0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
11dd0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
11de0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20  30000000L...    
11df0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
11e00 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53  ndif...    Tcl_S
11e10 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11e20 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63  "Error signing c
11e30 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c  ertificate",NULL
11e40 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
11e50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
11e60 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
11e70 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
11e80 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
11e90 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
11ea0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
11eb0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
11ec0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
11ed0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
11ee0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
11ef0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
11f00 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
11f10 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
11f20 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75  interp,pemout,bu
11f30 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
11f40 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
11f50 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
11f60 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
11f70 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
11f80 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
11f90 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
11fa0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d  filename(out,pem
11fb0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
11fc0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
11fd0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
11fe0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
11ff0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66  );...}....X509_f
12000 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50  ree(cert);...EVP
12010 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
12020 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
12030 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
12040 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f  x30000000L...BN_
12050 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
12060 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65  f..    }..}..bre
12070 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
12080 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ..break;.    }. 
12090 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
120a0 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
120b0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
120c0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
120d0 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20  *****/./* Init  
120e0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a             */./*
120f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12100 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
12110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12150 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
12160 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
12170 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
12180 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
12190 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
121a0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
121b0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
121c0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
121d0 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
121e0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
121f0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
12200 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
12210 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
12220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12260 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
12270 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20  char *blockPtr) 
12280 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
12290 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
122a0 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20  )blockPtr;..    
122b0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
122c0 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61  );..    Tls_Clea
122d0 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
122e0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72   ckfree(blockPtr
122f0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
12300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12340 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20   *. * Tls_Clean 
12350 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
12360 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
12370 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
12380 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
12390 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
123a0 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
123b0 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
123c0 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75  ow 1.  This shou
123d0 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20  ld. *.be called 
123e0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79  synchronously by
123f0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20   the CloseProc, 
12400 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76  not in the. *.Ev
12410 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c  entuallyFree cal
12420 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
12430 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
12440 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
12450 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
12460 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
12470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124b0 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43  -. */.void Tls_C
124c0 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74  lean(State *stat
124d0 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69  ePtr) {.    dpri
124e0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
124f0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65      /*.     * we
12500 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72  're assuming her
12510 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e  e that we're sin
12520 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20  gle-threaded.   
12530 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61    */.    if (sta
12540 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
12550 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
12560 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
12570 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
12580 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
12590 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
125a0 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  mer = NULL;.    
125b0 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
125c0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09  Ptr->protos) {..
125d0 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  ckfree(statePtr-
125e0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65  >protos);..state
125f0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
12600 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
12610 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
12620 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
12630 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
12640 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
12650 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
12660 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
12670 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
12680 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
12690 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
126a0 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
126b0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
126c0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
126d0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53  ) {..dprintf("SS
126e0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61  L_free(%p)", sta
126f0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53  tePtr->ssl);..SS
12700 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  L_free(statePtr-
12710 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72  >ssl);..statePtr
12720 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ssl = NULL;.  
12730 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
12740 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53  ePtr->ctx) {..SS
12750 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  L_CTX_free(state
12760 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74  Ptr->ctx);..stat
12770 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
12780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12790 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
127a0 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
127b0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
127c0 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
127d0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
127e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
127f0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
12800 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
12810 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
12820 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
12830 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
12840 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
12850 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
12860 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
12870 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
128c0 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
128d0 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
128e0 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
128f0 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
12900 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
12910 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
12920 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
12930 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
12940 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
12950 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
12960 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
12970 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
12980 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
12990 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
129a0 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
129b0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
129c0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c  ---------. */.DL
12a10 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
12a20 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
12a30 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63  *interp) {.    c
12a40 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
12a50 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
12a60 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
12a70 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
12a80 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  };..    dprintf(
12a90 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
12aa0 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  /*.     * We onl
12ab0 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e  y support Tcl 8.
12ac0 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20  4 or newer.     
12ad0 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64  */.    if (.#ifd
12ae0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
12af0 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  ..Tcl_InitStubs(
12b00 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
12b10 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67  ).#else..Tcl_Pkg
12b20 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
12b30 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30  "Tcl", "8.4-", 0
12b40 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55  ).#endif.. == NU
12b50 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
12b60 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
12b70 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e      if (TlsLibIn
12b80 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
12b90 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
12ba0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
12bb0 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
12bc0 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
12bd0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
12be0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12bf0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
12c00 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
12c10 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  p, "tls::ciphers
12c20 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
12c30 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
12c40 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
12c50 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
12c60 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
12c70 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
12c80 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
12c90 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
12ca0 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
12cb0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
12cc0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
12cd0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
12ce0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
12cf0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
12d00 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
12d10 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
12d20 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
12d30 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
12d40 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
12d50 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
12d60 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d  interp, "tls::im
12d70 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
12d80 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
12d90 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
12da0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
12db0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
12dc0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
12dd0 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72  p, "tls::unimpor
12de0 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
12df0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
12e00 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
12e10 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
12e20 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
12e30 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
12e40 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  , "tls::status",
12e50 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28   StatusObjCmd, (
12e60 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
12e70 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
12e80 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
12e90 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
12ea0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
12eb0 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
12ec0 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
12ed0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
12ee0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
12ef0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
12f00 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
12f10 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
12f20 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d  misc", MiscObjCm
12f30 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
12f40 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
12f50 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
12f60 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
12f70 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
12f80 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
12f90 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  ", ProtocolsObjC
12fa0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
12fb0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
12fc0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
12fd0 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
12fe0 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e  ) {..Tcl_Eval(in
12ff0 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
13000 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a  Script);.    }..
13010 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50      return(Tcl_P
13020 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
13030 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45  , "tls", PACKAGE
13040 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f  _VERSION));.}../
13050 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
13090 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d  *.Tls_SafeInit -
130a0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61  --------*. *.Sta
130e0 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20  ndard procedure 
130f0 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61  required by 'loa
13100 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  d'.. *.Initializ
13110 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f  es this extensio
13120 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74  n for a safe int
13130 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d  erpreter.. *.---
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
13170 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
13180 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c  s:. *..As of 'Tl
13190 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65  s_Init'. *. *.Re
131a0 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e  sult:. *..A stan
131b0 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63  dard Tcl error c
131c0 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ode.. *. *------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13200 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  *. */.DLLEXPORT 
13210 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74  int Tls_SafeInit
13220 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
13230 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e  erp) {.    dprin
13240 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20  tf("Called");.  
13250 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69    return(Tls_Ini
13260 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f  t(interp));.}../
13270 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
132b0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a  *.TlsLibInit --.
132c0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69  ------*. *.Initi
13300 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
13310 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
13320 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d  ication. *.-----
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
13360 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
13370 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73  . *..initializes
13380 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a   SSL library. *.
13390 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e   *.Result:. *..n
133a0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
133e0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
133f0 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75  TlsLibInit(int u
13400 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20  ninitialize) {. 
13410 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e     static int in
13420 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20  itialized = 0;. 
13430 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20     int status = 
13440 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  TCL_OK;.#if defi
13450 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
13460 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
13470 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
13480 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b   size_t num_lock
13490 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  s;.#endif..    i
134a0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  f (uninitialize)
134b0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21   {.        if (!
134c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20  initialized) {. 
134d0 20 20 20 20 20 20 20 20 20 20 20 64 70 72 69 6e             dprin
134e0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
134f0 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
13500 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
13510 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 20  lized");..      
13520 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c        return(TCL
13530 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _OK);.        }.
13540 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66  .        dprintf
13550 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69  ("Asked to unini
13560 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20  tialize");..#if 
13570 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
13580 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
13590 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
135a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74  .        Tcl_Mut
135b0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
135c0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c  ;..        if (l
135d0 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ocks) {.        
135e0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
135f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
13600 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ks = NULL;.     
13610 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e         locksCoun
13620 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
13630 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
13640 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
13650 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
13660 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
13670 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
13680 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54  READS).        T
13690 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
136a0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
136b0 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
136c0 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a  (TCL_OK);.    }.
136d0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c  .    if (initial
136e0 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20  ized) {.        
136f0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
13700 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
13710 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20  d value");.     
13720 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73     return(status
13730 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  );.    }..    dp
13740 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
13750 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
13760 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
13770 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
13780 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d  READS).    Tcl_M
13790 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
137a0 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  x);.#endif.    i
137b0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
137c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
137d0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
137e0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
137f0 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f  EADS).    num_lo
13800 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  cks = 1;.    loc
13810 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20  ksCount = (int) 
13820 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c  num_locks;.    l
13830 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  ocks = malloc(si
13840 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
13850 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d  um_locks);.    m
13860 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20  emset(locks, 0, 
13870 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
13880 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e   num_locks);.#en
13890 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  dif..    /* Init
138a0 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63  ialize BOTH libc
138b0 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c  rypto and libssl
138c0 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c  . */.    OPENSSL
138d0 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53  _init_ssl(OPENSS
138e0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f  L_INIT_LOAD_SSL_
138f0 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53  STRINGS | OPENSS
13900 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50  L_INIT_LOAD_CRYP
13910 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50  TO_STRINGS..| OP
13920 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
13930 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45  LL_CIPHERS | OPE
13940 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
13950 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29  L_DIGESTS, NULL)
13960 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74  ;..    BIO_new_t
13970 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69  cl(NULL, 0);..#i
13980 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  f 0.    /*.     
13990 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f  * XXX:TODO: Remo
139a0 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64  ve this code and
139b0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
139c0 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20   a check.     * 
139d0 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f  for enough entro
139e0 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72  py and do not tr
139f0 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  y to create our 
13a00 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69  own.     * terri
13a10 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20  ble entropy.    
13a20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   */.    /*.     
13a30 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f  * Seed the rando
13a40 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
13a50 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69  or in the SSL li
13a60 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73  brary,.     * us
13a70 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65  ing the do/while
13a80 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75   construct becau
13a90 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f  se of the bug no
13aa0 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a  te in the.     *
13ab0 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20   OpenSSL FAQ at 
13ac0 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73  http://www.opens
13ad0 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66  sl.org/support/f
13ae0 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20  aq.html#USER1.  
13af0 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20     *.     * The 
13b00 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62  crux of the prob
13b10 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61  lem is that Sola
13b20 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68  ris 7 does not h
13b30 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65  ave a.     * /de
13b40 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76  v/random or /dev
13b50 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20  /urandom device 
13b60 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74  so it cannot gat
13b70 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20  her enough.     
13b80 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74  * entropy from t
13b90 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77  he RAND_seed() w
13ba0 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69  hen TLS initiali
13bb0 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a  zes and refuses.
13bc0 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72       * to go fur
13bd0 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65  ther. Earlier ve
13be0 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53  rsions of OpenSS
13bf0 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67  L carried on reg
13c00 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f  ardless..     */
13c10 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69  .    srand((unsi
13c20 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28  gned int) time((
13c30 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29  time_t *) NULL))
13c40 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20  ;.    do {..for 
13c50 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20  (i = 0; i < 16; 
13c60 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f  i++) {..    rnd_
13c70 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63  seed[i] = 1 + (c
13c80 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61  har) (255.0 * ra
13c90 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31  nd()/(RAND_MAX+1
13ca0 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73  .0));..}..RAND_s
13cb0 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69  eed(rnd_seed, si
13cc0 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b  zeof(rnd_seed));
13cd0 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41  .    } while (RA
13ce0 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31  ND_status() != 1
13cf0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  );.#endif..#if d
13d00 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
13d10 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
13d20 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
13d30 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
13d40 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
13d50 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74  if...return(stat
13d60 75 73 29 3b 0a 7d 0a                             us);.}.