Hex Artifact Content

Artifact ec7ae85081c7daa7bc8a93ba6fcc673eee3d3b149a0b05ed5bfd4281670254ab:


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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63  nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61  lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d  festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69  in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23   < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e  error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61  SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a  ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29  ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e   \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 20  ULL) ? (char *) 
04a0: 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54  NULL : \...Tcl_T
04b0: 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
04c0: 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20  (interp, (key), 
04d0: 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20  (dsp)))..static 
04e0: 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69  SSL_CTX *CTX_Ini
04f0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
0500: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
0510: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
0520: 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63   *key,...char *c
0530: 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65  ertfile, unsigne
0540: 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31  d char *key_asn1
0550: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0560: 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 54 63  *cert_asn1,...Tc
0570: 6c 5f 53 69 7a 65 20 6b 65 79 5f 61 73 6e 31 5f  l_Size key_asn1_
0580: 6c 65 6e 2c 20 54 63 6c 5f 53 69 7a 65 20 63 65  len, Tcl_Size ce
0590: 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61  rt_asn1_len, cha
05a0: 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20  r *CApath, char 
05b0: 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20  *CAfile,...char 
05c0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
05d0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
05e0: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
05f0: 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69  Hparams);..stati
0600: 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74  c int.TlsLibInit
0610: 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a  (int uninitializ
0620: 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53  e);..#define TLS
0630: 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30  _PROTO_SSL2..0x0
0640: 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  1.#define TLS_PR
0650: 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23  OTO_SSL3..0x02.#
0660: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0670: 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66  _TLS1..0x04.#def
0680: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
0690: 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e  S1_1.0x08.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
06b0: 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20  _2.0x10.#define 
06c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
06d0: 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e  .0x20.#define EN
06e0: 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b  ABLED(flag, mask
06f0: 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61  ).(((flag) & (ma
0700: 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a  sk)) == (mask)).
0710: 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c  .#define SSLKEYL
0720: 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c  OGFILE.."SSLKEYL
0730: 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54  OGFILE"../*. * T
0740: 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43  hread-Safe TLS C
0750: 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ode. */..#ifdef 
0760: 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66  TCL_THREADS.#def
0770: 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ine OPENSSL_THRE
0780: 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c  AD_DEFINES.#incl
0790: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65  ude <openssl/ope
07a0: 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66  nsslconf.h>..#if
07b0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45  def OPENSSL_THRE
07c0: 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  ADS.#include <op
07d0: 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a  enssl/crypto.h>.
07e0: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
07f0: 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20  l/ssl.h>../*. * 
0800: 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69  Threaded operati
0810: 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b  on requires lock
0820: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a  ing callbacks. *
0830: 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79   Based from /cry
0840: 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f  pto/cryptlib.c o
0850: 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53  f OpenSSL and NS
0860: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74  OpenSSL.. */..st
0870: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a  atic Tcl_Mutex *
0880: 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74  locks = NULL;.st
0890: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f  atic int locksCo
08a0: 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  unt = 0;.static 
08b0: 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d  Tcl_Mutex init_m
08c0: 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45  x;.#endif /* OPE
08d0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a  NSSL_THREADS */.
08e0: 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48  #endif /* TCL_TH
08f0: 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a  READS */..../***
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0910: 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20  */./* Callbacks 
0920: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0940: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0990: 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43   Eval Callback C
09a0: 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ommand --. *. *.
09b0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
09c0: 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20  mmand and catch 
09d0: 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a  any errors. *. *
09e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d   Results:. *.0 =
09f0: 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65   Command returne
0a00: 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72  d fail or eval r
0a10: 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f  eturned TCL_ERRO
0a20: 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64  R. *.1 = Command
0a30: 20 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 73   returned succes
0a40: 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e  s or eval return
0a50: 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20  ed TCL_OK. *. * 
0a60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
0a70: 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62  .Evaluates callb
0a80: 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20  ack command. *. 
0a90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0aa0: 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0ae0: 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b  int.EvalCallback
0af0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
0b00: 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74  erp, State *stat
0b10: 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  ePtr, Tcl_Obj *c
0b20: 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74  mdPtr) {.    int
0b30: 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a   code, ok = 0;..
0b40: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
0b50: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  led");..    Tcl_
0b60: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
0b70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
0b80: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
0b90: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
0ba0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
0bb0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69  Eval callback wi
0bc0: 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f  th success for o
0bd0: 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75  k or return valu
0be0: 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72  e 1, fail for er
0bf0: 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61  ror or return va
0c00: 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c  lue 0 */.    Tcl
0c10: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
0c20: 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  erp);.    code =
0c30: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
0c40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
0c50: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
0c60: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 76  .    dprintf("Ev
0c70: 61 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c  alCallback: %d",
0c80: 20 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28   code);.    if (
0c90: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20  code == TCL_OK) 
0ca0: 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75  {../* Check resu
0cb0: 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61  lt for return va
0cc0: 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20  lue */..Tcl_Obj 
0cd0: 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  *result = Tcl_Ge
0ce0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
0cf0: 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20  p);..if (result 
0d00: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47  == NULL || Tcl_G
0d10: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
0d20: 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b  erp, result, &ok
0d30: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
0d40: 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09      ok = 1;..}..
0d50: 64 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a  dprintf("Result:
0d60: 20 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d   %d", ok);.    }
0d70: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f   else {../* Erro
0d80: 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63  r - reject the c
0d90: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64  ertificate */..d
0da0: 70 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b  printf("Tcl_Back
0db0: 67 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23  groundError");.#
0dc0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
0dd0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
0de0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
0df0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
0e00: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
0e10: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
0e20: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
0e30: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
0e40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
0e50: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
0e60: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
0e70: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
0e80: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
0e90: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
0ea0: 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a     return ok;.}.
0eb0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0f00: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d   InfoCallback --
0f10: 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20  . *. *.Monitors 
0f20: 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  SSL connection p
0f30: 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73  rocess. *. * Res
0f40: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
0f50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0f60: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
0f70: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
0f80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
0fd0: 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61  atic void.InfoCa
0fe0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
0ff0: 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65   *ssl, int where
1000: 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20  , int ret) {.   
1010: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
1020: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67   = (State*)SSL_g
1030: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c  et_app_data((SSL
1040: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c   *)ssl);.    Tcl
1050: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
1060: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
1070: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
1080: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e  *cmdPtr;.    con
1090: 73 74 20 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20  st char *major, 
10a0: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72  *minor;..    dpr
10b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
10c0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
10d0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
10e0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
10f0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
1100: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1110: 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b   SSL_CB_HANDSHAK
1120: 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f  E_START) {..majo
1130: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
1140: 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74  ..minor = "start
1150: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
1160: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1170: 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29  _HANDSHAKE_DONE)
1180: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1190: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
11a0: 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20  = "done";.    } 
11b0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72  else {..if (wher
11c0: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
11d0: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72  )..major = "aler
11e0: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  t";..else if (wh
11f0: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e  ere & SSL_ST_CON
1200: 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63  NECT).major = "c
1210: 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69  onnect";..else i
1220: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
1230: 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72  T_ACCEPT)..major
1240: 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c   = "accept";..el
1250: 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22  se.....major = "
1260: 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28  unknown";...if (
1270: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52  where & SSL_CB_R
1280: 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72  EAD)..minor = "r
1290: 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ead";..else if (
12a0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57  where & SSL_CB_W
12b0: 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22  RITE)..minor = "
12c0: 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66  write";..else if
12d0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
12e0: 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20  _LOOP)..minor = 
12f0: 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66  "loop";..else if
1300: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1310: 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20  _EXIT)..minor = 
1320: 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09  "exit";..else...
1330: 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f  ..minor = "unkno
1340: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
1350: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
1360: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
1370: 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20  n, chan, major, 
1380: 6d 69 6e 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20  minor, message, 
1390: 61 6e 64 20 74 79 70 65 20 61 72 67 73 20 2a 2f  and type args */
13a0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
13b0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
13c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
13d0: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
13e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
13f0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1400: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1410: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a  j("info", -1));.
1420: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1430: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1440: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1450: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1460: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
1470: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
1480: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
1490: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
14c0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72  wStringObj(major
14d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
14e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1500: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1510: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29  ngObj(minor, -1)
1520: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72  );..    if (wher
1530: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1540: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
1550: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1560: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1570: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1580: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65  Obj(SSL_alert_de
1590: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  sc_string_long(r
15a0: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  et), -1));..Tcl_
15b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
15c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
15d0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
15e0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61  wStringObj(SSL_a
15f0: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67  lert_type_string
1600: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29  _long(ret), -1))
1610: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1620: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1630: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1640: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1650: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
1660: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
1670: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b  long(ssl), -1));
1680: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1690: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
16a0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
16b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
16c0: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  o", -1));.    }.
16d0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
16e0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
16f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1700: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
1710: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
1720: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
1730: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
1740: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1750: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
1760: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73  -----. *. * Mess
17b0: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  ageCallback --. 
17c0: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
17d0: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  L protocol messa
17e0: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ges. *. * Result
17f0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
1800: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
1810: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
1820: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
1830: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64  ------. */.#ifnd
1880: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
1890: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76  L_TRACE.static v
18a0: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62  oid.MessageCallb
18b0: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c  ack(int write_p,
18c0: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e   int version, in
18d0: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20  t content_type, 
18e0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c  const void *buf,
18f0: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c   size_t len, SSL
1900: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67   *ssl, void *arg
1910: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
1920: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
1930: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
1940: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
1950: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1960: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
1970: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20  mdPtr;.    char 
1980: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20  *ver, *type;.   
1990: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63   BIO *bio;.    c
19a0: 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30  har buffer[15000
19b0: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d  ];.    buffer[0]
19c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
19d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
19e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
19f0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
1a00: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
1a10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
1a20: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f     switch(versio
1a30: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  n) {.#if OPENSSL
1a40: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1a50: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
1a60: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1a70: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
1a80: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
1a90: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45      case SSL2_VE
1aa0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1ab0: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv2";..break;.#
1ac0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
1ad0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
1ae0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1af0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73  NO_SSL3).    cas
1b00: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL3_VERSION:.
1b10: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a  .ver = "SSLv3";.
1b20: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1b30: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52     case TLS1_VER
1b40: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1b50: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  Sv1";..break;.  
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45    case TLS1_1_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b80: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.1";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32  .    case TLS1_2
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65   "TLSv1.2";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1bd0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_3_VERSION:..ve
1be0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09  r = "TLSv1.3";..
1bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c00: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22  0:..ver = "none"
1c10: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;..break;.    de
1c20: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75  fault:..ver = "u
1c30: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b  nknown";..break;
1c40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
1c50: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65  ch (content_type
1c60: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ) {.    case SSL
1c70: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79  3_RT_HEADER:..ty
1c80: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09  pe = "Header";..
1c90: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1ca0: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f  SSL3_RT_INNER_CO
1cb0: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70  NTENT_TYPE:..typ
1cc0: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65  e = "Inner Conte
1cd0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b  nt Type";..break
1ce0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1cf0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52  RT_CHANGE_CIPHER
1d00: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22  _SPEC:..type = "
1d10: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a  Change Cipher";.
1d20: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d30: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a   SSL3_RT_ALERT:.
1d40: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b  .type = "Alert";
1d50: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d60: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d70: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d80: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b  ndshake";..break
1d90: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1da0: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44  RT_APPLICATION_D
1db0: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70  ATA:..type = "Ap
1dc0: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b  p Data";..break;
1dd0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
1de0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
1df0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61  30000000L.    ca
1e00: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52  se DTLS1_RT_HEAR
1e10: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22  TBEAT:..type = "
1e20: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65  Heartbeat";..bre
1e30: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
1e40: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20  efault:..type = 
1e50: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1e60: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63  ..    /* Needs c
1e70: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69  ompile time opti
1e80: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74  on "enable-ssl-t
1e90: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66  race". */.    if
1ea0: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77   ((bio = BIO_new
1eb0: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21  (BIO_s_mem())) !
1ec0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e  = NULL) {..int n
1ed0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69  ;..SSL_trace(wri
1ee0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63  te_p, version, c
1ef0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66  ontent_type, buf
1f00: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69  , len, ssl, (voi
1f10: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42  d *)bio);..n = B
1f20: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
1f30: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  fer, BIO_pending
1f40: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20  (bio) < 15000 ? 
1f50: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1f60: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20   : 14999);..n = 
1f70: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1f80: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1f90: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1fa0: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
1fb0: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
1fc0: 64 70 72 69 6e 74 66 28 22 4d 65 73 73 61 67 65  dprintf("Message
1fd0: 20 64 69 72 65 63 74 69 6f 6e 3d 25 64 2c 20 76   direction=%d, v
1fe0: 65 72 3d 25 73 2c 20 74 79 70 65 3d 25 73 2c 20  er=%s, type=%s, 
1ff0: 6d 65 73 73 61 67 65 3d 25 73 22 2c 20 77 72 69  message=%s", wri
2000: 74 65 5f 70 2c 20 76 65 72 2c 20 74 79 70 65 2c  te_p, ver, type,
2010: 20 26 62 75 66 66 65 72 5b 30 5d 29 3b 0a 0a 20   &buffer[0]);.. 
2020: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
2030: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
2040: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65  h fn, chan, dire
2050: 63 74 69 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20  ction, version, 
2060: 74 79 70 65 2c 20 61 6e 64 20 6d 65 73 73 61 67  type, and messag
2070: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
2080: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
2090: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
20a0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
20b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
20d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
20e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73  wStringObj("mess
20f0: 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  age", -1));.    
2100: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2110: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2120: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
2130: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
2140: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2150: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
2160: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f  ingObj(write_p ?
21b0: 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63 65 69   "Sent" : "Recei
21c0: 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ved", -1));.    
21d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
21e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
21f0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2200: 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d  StringObj(ver, -
2210: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2220: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2230: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2240: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2250: 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20  bj(type, -1));. 
2260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2280: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2290: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66  NewStringObj(buf
22a0: 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  fer, -1));..    
22b0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
22c0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
22d0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
22e0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
22f0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
2300: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
2310: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
2320: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2330: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f  r);.}.#endif.../
2340: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
2390: 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a  rifyCallback --.
23a0: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53   *. *.Monitors S
23b0: 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 20 76  SL certificate v
23c0: 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73  alidation proces
23d0: 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e 74 72  s. Used to contr
23e0: 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 76 69  ol the. *.behavi
23f0: 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 4c 5f  or when the SSL_
2400: 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c 61 67  VERIFY_PEER flag
2410: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
2420: 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65   called. *.whene
2430: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74  ver a certificat
2440: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 20 6f  e is inspected o
2450: 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 6c 69  r decided invali
2460: 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a  d. Called for. *
2470: 09 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74  .each certificat
2480: 65 20 69 6e 20 74 68 65 20 63 65 72 74 20 63 68  e in the cert ch
2490: 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b  ain.. *. * Check
24a0: 73 3a 0a 20 2a 09 54 68 65 20 63 65 72 74 69 66  s:. *.The certif
24b0: 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63  icate chain is c
24c0: 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20  hecked starting 
24d0: 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74  with the deepest
24e0: 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20   nesting level. 
24f0: 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41  *.  (the root CA
2500: 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e   certificate) an
2510: 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20  d worked upward 
2520: 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65  to the peer's ce
2530: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c  rtificate.. *.Al
2540: 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65  l signatures are
2550: 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20   valid, current 
2560: 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66  time is within f
2570: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61  irst and last va
2580: 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09  lidity time.. *.
2590: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63  Check that the c
25a0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73  ertificate is is
25b0: 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75  sued by the issu
25c0: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69  er certificate i
25d0: 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20  ssuer.. *.Check 
25e0: 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73  the revocation s
25f0: 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63  tatus for each c
2600: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43  ertificate.. *.C
2610: 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74  heck the validit
2620: 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43  y of the given C
2630: 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20  RL and the cert 
2640: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75  revocation statu
2650: 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20  s.. *.Check the 
2660: 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20  policies of all 
2670: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73  the certificates
2680: 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70  . *. * Args. *.p
2690: 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69  reverify_ok indi
26a0: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68  cates whether th
26b0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65  e certificate ve
26c0: 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65  rification passe
26d0: 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29  d (1) or not (0)
26e0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
26f0: 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f   *.A callback bo
2700: 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65  und to the socke
2710: 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65  t may return one
2720: 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09   of:. *.    0...
2730: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2740: 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61  e is deemed inva
2750: 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69  lid, send verifi
2760: 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66  cation. *....  f
2770: 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20  ailure alert to 
2780: 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e  peer, and termin
2790: 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20  ate handshake.. 
27a0: 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20  *.    1...- the 
27b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
27c0: 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e  eemed valid, con
27d0: 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73  tinue with hands
27e0: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70  hake.. *.    emp
27f0: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63  ty string.- no c
2800: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69  hange to certifi
2810: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a  cate validation.
2820: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2830: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
2840: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
2850: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
2860: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
2870: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
2880: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
2890: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
28a0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20  lure reason. *. 
28b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
2900: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61  int.VerifyCallba
2910: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f  ck(int ok, X509_
2920: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20  STORE_CTX *ctx) 
2930: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  {.    Tcl_Obj *c
2940: 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20  mdPtr;.    SSL  
2950: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58   *ssl..= (SSL*)X
2960: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2970: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53  t_ex_data(ctx, S
2980: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58  SL_get_ex_data_X
2990: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64  509_STORE_CTX_id
29a0: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20  x());.    X509  
29b0: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54  *cert..= X509_ST
29c0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72  ORE_CTX_get_curr
29d0: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20  ent_cert(ctx);. 
29e0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
29f0: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr.= (State*)SSL
2a00: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73  _get_app_data(ss
2a10: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
2a20: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
2a30: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
2a40: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
2a50: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
2a60: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
2a70: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
2a80: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
2a90: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
2aa0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
2ab0: 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64  "Called");.    d
2ac0: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61  printf("VerifyCa
2ad0: 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29  llback: %d", ok)
2ae0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2af0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
2b00: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
2b10: 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 65 20  /* Use ok value 
2b20: 69 66 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  if verification 
2b30: 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 09  is required */..
2b40: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66  if (statePtr->vf
2b50: 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46  lags & SSL_VERIF
2b60: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
2b70: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72  R_CERT) {..    r
2b80: 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73  eturn ok;..} els
2b90: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
2ba0: 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  1;..}.    } else
2bb0: 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c   if (cert == NUL
2bc0: 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c  L || ssl == NULL
2bd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
2be0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
2bf0: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2c00: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b  k: eval callback
2c10: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  ");..    /* Crea
2c20: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2c30: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
2c40: 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e  , depth, cert in
2c50: 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c  fo list, status,
2c60: 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20   and error args 
2c70: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
2c80: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2c90: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
2ca0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2cb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2cc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2cd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2ce0: 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a  "verify", -1));.
2cf0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2d00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2d10: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
2d20: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
2d30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2d40: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
2d50: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
2d60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2d70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2d80: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
2d90: 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20  Obj(depth));.   
2da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2db0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2dc0: 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65  , cmdPtr, Tls_Ne
2dd0: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
2de0: 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c   cert));.    Tcl
2df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2e10: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
2e20: 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63  Obj(ok));.    Tc
2e30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2e40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2e50: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2e60: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
2e70: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
2e80: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72  _error_string(er
2e90: 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  r), -1));..    /
2ea0: 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 77 68  * Prevent I/O wh
2eb0: 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ile callback is 
2ec0: 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20  in progress */. 
2ed0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e     /* statePtr->
2ee0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
2ef0: 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20  _CALLBACK; */.. 
2f00: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
2f10: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
2f20: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2f30: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
2f40: 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61   ok = EvalCallba
2f50: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
2f60: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
2f70: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2f80: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
2f90: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2fa0: 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e  Callback: comman
2fb0: 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 2c 20  d result = %d", 
2fc0: 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61  ok);..    /* sta
2fd0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  tePtr->flags &= 
2fe0: 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  ~(TLS_TCL_CALLBA
2ff0: 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
3000: 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66  rn ok;./* By def
3010: 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69  ault, leave veri
3020: 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  fication unchang
3030: 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ed. */.}.../*. *
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72  ---. *. * Tls_Er
3090: 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ror --. *. *.Cal
30a0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ls callback with
30b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
30c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
30d0: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
30e0: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
30f0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
3100: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
3110: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
3120: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
3130: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
3140: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20  lure reason. *. 
3150: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c  ----. */.void.Tl
31a0: 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73  s_Error(State *s
31b0: 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20 63  tatePtr, const c
31c0: 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20  har *msg) {.    
31d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
31e0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
31f0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
3200: 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73  bj *cmdPtr, *lis
3210: 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  tPtr;.    unsign
3220: 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20  ed long err;.   
3230: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d   statePtr->err =
3240: 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e   msg;..    dprin
3250: 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20  tf("Called with 
3260: 6d 65 73 73 61 67 65 20 25 73 22 2c 20 6d 73 67  message %s", msg
3270: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
3280: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
3290: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
32a0: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ) {..return;.   
32b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
32c0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
32d0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
32e0: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67   and message arg
32f0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
3300: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
3310: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
3320: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
3330: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3340: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3350: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3360: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d  ngObj("error", -
3370: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
3380: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3390: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
33a0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
33b0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
33c0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
33d0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
33e0: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d  ;.    if (msg !=
33f0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69   NULL) {..Tcl_Li
3400: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3410: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3420: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3430: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a  Obj(msg, -1));..
3440: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
3450: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  msg = Tcl_GetStr
3460: 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  ing(Tcl_GetObjRe
3470: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21  sult(interp))) !
3480: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c  = NULL) {..Tcl_L
3490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
34a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
34b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
34c0: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a  gObj(msg, -1));.
34d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c  .    } else {..l
34e0: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
34f0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
3500: 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d  ;..while ((err =
3510: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29   ERR_get_error()
3520: 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) != 0) {..    T
3530: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3540: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3550: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
3560: 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65  StringObj(ERR_re
3570: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
3580: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d  g(err), -1));..}
3590: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
35a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
35b0: 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50  p, cmdPtr, listP
35c0: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
35d0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
35e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
35f0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3600: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
3610: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
3620: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
3630: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
3640: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3650: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c  . *. * KeyLogCal
36b0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57  lback --. *. *.W
36c0: 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65  rite received ke
36d0: 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69  y data to log fi
36e0: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  le.. *. * Side e
36f0: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
3700: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
3750: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  d KeyLogCallback
3760: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
3770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e   const char *lin
3780: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  e) {.    char *s
3790: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b  tr = getenv(SSLK
37a0: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20  EYLOGFILE);.    
37b0: 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64  FILE *fd;..    d
37c0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
37d0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20  ;..    if (str) 
37e0: 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74  {..fd = fopen(st
37f0: 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74  r, "a");..fprint
3800: 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e  f(fd, "%s\n",lin
3810: 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b  e);..fclose(fd);
3820: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f  ---. *. * Passwo
3880: 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  rd Callback --. 
3890: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
38a0: 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e   a password is n
38b0: 65 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76  eeded for a priv
38c0: 61 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61  ate key when loa
38d0: 64 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69  ding. *.or stori
38e0: 6e 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69  ng a PEM certifi
38f0: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70  cate with encryp
3900: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c  tion. Evals call
3910: 62 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61  back. *.script a
3920: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72  nd returns the r
3930: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73  esult as the pas
3940: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20  sword string in 
3950: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  buf.. *. * Resul
3960: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
3970: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3980: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
3990: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
39a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
39b0: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69  .Password size i
39c0: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f  n bytes or -1 fo
39d0: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  r an error.. *. 
39e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3a30: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
3a40: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
3a50: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77  int size, int rw
3a60: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74  flag, void *udat
3a70: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
3a80: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
3a90: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
3aa0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3ab0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
3ac0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
3ad0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
3ae0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63  int code;.    Tc
3af0: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20  l_Size len;..   
3b00: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3b10: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ");..    /* If n
3b20: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20  o callback, use 
3b30: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b  default callback
3b40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
3b50: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
3b60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54  = NULL) {..if (T
3b70: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70  cl_EvalEx(interp
3b80: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64  , "tls::password
3b90: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
3ba0: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f  GLOBAL) == TCL_O
3bb0: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  K) {..    char *
3bc0: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3bd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3be0: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3bf0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c  sult(interp), &l
3c00: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
3c10: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  n > (Tcl_Size) s
3c20: 69 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d  ize-1) {...len =
3c30: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3c40: 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  -1;..    }..    
3c50: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3c60: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
3c70: 0a 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d  ..    buf[len] =
3c80: 20 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75   '\0';..    retu
3c90: 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d  rn (int) len;..}
3ca0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
3cb0: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d  urn -1;..}.    }
3cc0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3cd0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
3ce0: 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c  with fn, rwflag,
3cf0: 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a   and size args *
3d00: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
3d10: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
3d20: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3d30: 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  rd);.    Tcl_Lis
3d40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3d50: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3d60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3d70: 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d  bj("password", -
3d80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
3d90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3da0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3db0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3dc0: 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63  rwflag));.    Tc
3dd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3de0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3df0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3e00: 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20  tObj(size));..  
3e10: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3e20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3e30: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
3e40: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3e50: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3e60: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
3e70: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
3e80: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
3e90: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
3ea0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
3eb0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
3ec0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
3ed0: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
3ee0: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
3ef0: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  {.#if (TCL_MAJOR
3f00: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
3f10: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
3f20: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
3f30: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
3f40: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
3f50: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
3f60: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
3f70: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
3f80: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
3f90: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3fa0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
3fb0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
3fc0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
3fd0: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
3fe0: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77   pass back passw
3ff0: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74  ord string and t
4000: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c  runcate if too l
4010: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ong */.    if (c
4020: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
4030: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
4040: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
4050: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
4060: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
4070: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
4080: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
4090: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20  e) size-1) {..  
40a0: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a    len = (Tcl_Siz
40b0: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73  e) size-1;..}..s
40c0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
40d0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
40e0: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  .buf[len] = '\0'
40f0: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28  ;..Tcl_Release((
4100: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
4110: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e  rp);..return (in
4120: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  t) len;.    }.  
4130: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
4140: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
4150: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  p);.    return -
4160: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  1;.}.../*. *----
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
41b0: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61   *. * Session Ca
41c0: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
41d0: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  ts --. *. *.Call
41e0: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65  ed when a new se
41f0: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ssion is added t
4200: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20  o the cache. In 
4210: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20  TLS 1.3. *.this 
4220: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20  may be received 
4230: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
4240: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  fter the handsha
4250: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69  ke. For. *.earli
4260: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69  er versions, thi
4270: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76  s will be receiv
4280: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61  ed during the ha
4290: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73  ndshake.. *.This
42a0: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65   is the preferre
42b0: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20  d way to obtain 
42c0: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73  a resumable sess
42d0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
42e0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
42f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4300: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4310: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
4320: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
4330: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20  s:. *.0 = error 
4340: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69  where session wi
4350: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  ll be immediatel
4360: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  y removed from t
4370: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
4380: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73  e.. *.1 = succes
4390: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61  s where app reta
43a0: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73  ins session in s
43b0: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e  ession cache, an
43c0: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f  d must call SSL_
43d0: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77  SESSION_free() w
43e0: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  hen done.. *. *-
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
4440: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  t.SessionCallbac
4450: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f  k(SSL *ssl, SSL_
4460: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
4470: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4480: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4490: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
44a0: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
44b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
44c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
44d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
44e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
44f0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4500: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
4510: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
4520: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
4530: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74  n_id;.    size_t
4540: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67   len2;.    unsig
4550: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20  ned int ulen;.. 
4560: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4570: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4580: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4590: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
45a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
45b0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
45c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
45d0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
45e0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
45f0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4600: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4610: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
4620: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
4630: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65  , session id, se
4640: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e  ssion ticket, an
4650: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20  d lifetime args 
4660: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
4670: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4680: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4690: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
46a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
46b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
46c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
46d0: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
46e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
46f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4700: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4710: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
4720: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
4730: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
4740: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
4750: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
4760: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
4770: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
4780: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
4790: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
47a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
47b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
47c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
47d0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
47e0: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
47f0: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  ize) ulen));..  
4800: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
4810: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
4820: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
4830: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
4840: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
4850: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4860: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4870: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4880: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
4890: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
48a0: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a   len2));..    /*
48b0: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62   Lifetime - numb
48c0: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f  er of seconds */
48d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
48e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
48f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
4900: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c  cl_NewLongObj((l
4910: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ong) SSL_SESSION
4920: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
4930: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
4940: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  n)));..    /* Ev
4950: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
4960: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
4970: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4980: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
4990: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
49a0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
49b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
49c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
49d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20      /* Return 0 
49e0: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65  for now until se
49f0: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69  ssion handling i
4a00: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
4a10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
4a20: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
4a70: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
4a80: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
4a90: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
4aa0: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4ab0: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4ac0: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4ad0: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4ae0: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4af0: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
4b00: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
4b10: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
4b20: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
4b30: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
4b40: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
4b50: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
4b60: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
4b70: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
4b80: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4b90: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4ba0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4bb0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4bc0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4bd0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4be0: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4bf0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
4c00: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4c10: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4c20: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4c30: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
4c40: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
4c50: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
4c60: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
4c70: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
4c80: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
4c90: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
4ca0: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4cb0: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4cc0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4cd0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4ce0: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4cf0: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
4d00: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
4d10: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
4d20: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
4d30: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
4d40: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4d50: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4da0: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4db0: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
4dc0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4dd0: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
4de0: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65  gned char *outle
4df0: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n,..const unsign
4e00: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73  ed char *in, uns
4e10: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c  igned int inlen,
4e20: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
4e30: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4e40: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
4e50: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4e60: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4e70: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4e80: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4e90: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
4ea0: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
4eb0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4ec0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4ed0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
4ee0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4ef0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4f00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4f10: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
4f20: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
4f30: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
4f40: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4f50: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  *) out, outlen, 
4f60: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4f70: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4f80: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4f90: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4fa0: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4fb0: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4fc0: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4fd0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4fe0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4ff0: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
5000: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
5010: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
5020: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
5030: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
5040: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
5050: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5060: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
5070: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
5080: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
5090: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
50a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
50b0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
50c0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
50d0: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
50e0: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
50f0: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
5100: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
5110: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5120: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
5130: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
5140: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5150: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5160: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5170: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
5180: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
51a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
51b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
51c0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
51d0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
51e0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
51f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5200: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5210: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5220: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73  wStringObj((cons
5230: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20  t char *) *out, 
5240: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5250: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5260: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5270: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
5280: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f  nObj(res == SSL_
5290: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b  TLSEXT_ERR_OK));
52a0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
52b0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
52c0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
52d0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
52e0: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
52f0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5300: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5310: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
5320: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5330: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5340: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5350: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5360: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5370: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5380: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5390: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
53a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
53b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
53c0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
53d0: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69  --. *. * Adverti
5430: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c  se Protocols Cal
5440: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50  lback for Next P
5450: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
5460: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72  ion (NPN) in Ser
5470: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20  verHello --. *. 
5480: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.called when a 
5490: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73  TLS server needs
54a0: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f   a list of suppo
54b0: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66  rted protocols f
54c0: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f  or Next. *.Proto
54d0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
54e0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
54f0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
5500: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20  de effects:. *. 
5510: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
5520: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5530: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  R_OK: NPN protoc
5540: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
5550: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
5560: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5570: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5580: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  NPN protocol not
5590: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
55a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
55b0: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5600: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
5610: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43  .static int.NPNC
5620: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5630: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
5640: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
5650: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  t, unsigned int 
5660: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  *outlen, void *a
5670: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5680: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5690: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70  te*)arg;..    dp
56a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
56b0: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
56c0: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
56d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
56e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
56f0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5700: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c   /* Set protocol
5710: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66  s list */.    if
5720: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
5730: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a  os != NULL) {..*
5740: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  out = statePtr->
5750: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e  protos;..*outlen
5760: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
5770: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
5780: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55  lse {..*out = NU
5790: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30  LL;..*outlen = 0
57a0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  ;..return SSL_TL
57b0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
57c0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
57d0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
57e0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f  OK;.}.#endif.../
57f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5830: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e  -------. *. * SN
5840: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  I Callback for S
5850: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
5860: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73  Perform server-s
5870: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  ide SNI hostname
5880: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72   selection after
5890: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65   receiving SNI e
58a0: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43  xtension. *.in C
58b0: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c  lient Hello. Cal
58c0: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20  led after hello 
58d0: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66  callback but bef
58e0: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63  ore ALPN callbac
58f0: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
5900: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
5910: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5920: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
5930: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
5940: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
5950: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5960: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  RR_OK: SNI hostn
5970: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e  ame is accepted.
5980: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5990: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
59a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
59b0: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f  RT_FATAL: SNI ho
59c0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
59d0: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
59e0: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73  ection. *.    is
59f0: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c   aborted. Defaul
5a00: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53  t for alert is S
5a10: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
5a20: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f  ED_NAME.. *.SSL_
5a30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5a40: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f  _WARNING: SNI ho
5a50: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5a60: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20  cepted, warning 
5a70: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e  alert. *.    sen
5a80: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  t (not supported
5a90: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68   in TLSv1.3). Th
5aa0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5ab0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
5ac0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
5ad0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5ae0: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e   not accepted an
5af0: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67  d not acknowledg
5b00: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20  ed,. *.    e.g. 
5b10: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62  if SNI has not b
5b20: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20  een configured. 
5b30: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5b40: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b90: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5ba0: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f  t.SNICallback(co
5bb0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
5bc0: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
5bd0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
5be0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5bf0: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
5c00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5c10: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
5c20: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
5c30: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
5c40: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
5c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
5c60: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  vername = NULL;.
5c70: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5c80: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5c90: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5ca0: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5cb0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5cc0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5cd0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
5ce0: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e  works for TLS 1.
5cf0: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f  2 and earlier */
5d00: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
5d10: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  = SSL_get_server
5d20: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
5d30: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
5d40: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ame);.    if (!s
5d50: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72  ervername || ser
5d60: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c  vername[0] == '\
5d70: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  0') {..return SS
5d80: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5d90: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5da0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5db0: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5dc0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5dd0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5de0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5df0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
5e00: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
5e10: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72  chan, and server
5e20: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20   name args */.  
5e30: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5e40: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5e50: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5e60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5e70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5e80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5e90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5ea0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5eb0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5ec0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5ed0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5ee0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5ef0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5f00: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5f10: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5f20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5f30: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5f40: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5f50: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5f60: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5f70: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5f80: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5f90: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5fa0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5fb0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5fc0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5fd0: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5fe0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5ff0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
6000: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
6010: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
6020: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
6030: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
6040: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
6050: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
6060: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
6070: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
6080: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6090: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
60a0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
60b0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
60c0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
60d0: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
60e0: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
60f0: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
6100: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6110: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6120: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
6130: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
6180: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
6190: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
61a0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
61b0: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
61c0: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
61d0: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
61e0: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
61f0: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
6200: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
6210: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
6220: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
6230: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
6240: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
6250: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
6260: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
6270: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
6280: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
6290: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
62a0: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
62b0: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
62c0: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
62d0: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
62e0: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
62f0: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
6300: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
6310: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
6320: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
6330: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
6340: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
6350: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
6360: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
6370: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
6380: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
6390: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
63a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
63b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
63c0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
63d0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
63e0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
63f0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
6400: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6410: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
6420: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
6430: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
6440: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
6450: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
6460: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
6470: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
6480: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
6490: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
64a0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
64b0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
64c0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
64d0: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
6530: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53  HelloCallback(SS
6540: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
6550: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
6560: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
6570: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
6580: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
6590: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
65a0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
65b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
65c0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
65d0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
65e0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
65f0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6600: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6610: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
6620: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
6630: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
6640: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
6650: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
6660: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
6670: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6680: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6690: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
66a0: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
66b0: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
66c0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
66d0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
66e0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
66f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6700: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6710: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
6720: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
6730: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
6740: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
6750: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
6760: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
6770: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6780: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6790: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
67a0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
67b0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
67c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
67d0: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
67e0: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
67f0: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6800: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6810: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
6820: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
6830: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
6840: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
6850: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6860: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
6870: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
6880: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6890: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
68a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
68b0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
68c0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
68d0: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
68e0: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
68f0: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6900: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6910: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
6920: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
6930: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
6940: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
6950: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
6960: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6970: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6980: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6990: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
69a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
69b0: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
69c0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
69d0: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
69e0: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
69f0: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6a00: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6a10: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
6a20: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
6a30: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6a40: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6a50: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6a60: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
6a80: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6a90: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6aa0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6ab0: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
6ac0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6ad0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6ae0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6af0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6b00: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6b10: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6b20: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6b30: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6b40: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6b50: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6b60: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
6b70: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65  fn, chan, and se
6b80: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a  rver name args *
6b90: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
6ba0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
6bb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
6bc0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6bd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6be0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
6bf0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6c00: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  hello", -1));.  
6c10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6c20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6c30: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
6c40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6c50: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
6c60: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
6c70: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
6c80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6c90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6ca0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6cb0: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
6cc0: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ame, (Tcl_Size) 
6cd0: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  len));..    /* E
6ce0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
6cf0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
6d00: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
6d10: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
6d20: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
6d30: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
6d40: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
6d50: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6d60: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54  CLIENT_HELLO_RET
6d70: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  RY;..*alert = SS
6d80: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6d90: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a  USER_CANCELLED;.
6da0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
6db0: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
6dc0: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6dd0: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20  LLO_SUCCESS;.   
6de0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
6df0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6e00: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74  O_ERROR;..*alert
6e10: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6e20: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
6e40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6e50: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6e60: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a  urn res;.}.../**
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e80: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  **/./* Commands 
6e90: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
6ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6eb0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
6ec0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
6f00: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
6f10: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
6f20: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09  e ciphers. *. *.
6f30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
6f40: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
6f50: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63  cess the "tls::c
6f60: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a  iphers" command.
6f70: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
6f80: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61  able ciphers, ba
6f90: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f  sed upon protoco
6fa0: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20  l selected.. *. 
6fb0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
6fc0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6fd0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
6fe0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6ff0: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20  .constructs and 
7000: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e  destroys SSL con
7010: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
7070: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
7080: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
7090: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
70a0: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
70b0: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
70c0: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
70d0: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
70e0: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
70f0: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
7100: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
7110: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
7120: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61  TLS_NONE.};..sta
7130: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f  tic int.CiphersO
7140: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
7150: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
7160: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7170: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7180: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7190: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
71a0: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
71b0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
71c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
71d0: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
71e0: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
71f0: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
7200: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
7210: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
7220: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
7230: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
7240: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
7250: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20  ETHOD *method;. 
7260: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
7270: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
7280: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
7290: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32     if ((objc < 2
72a0: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
72b0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
72c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
72d0: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  objv, "protocol 
72e0: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f  ?verbose? ?suppo
72f0: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e  rted?");..return
7300: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7310: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
7320: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
7330: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70  terp, objv[1], p
7340: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f  rotocols, "proto
7350: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  col", 0, &index)
7360: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
7370: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7380: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
7390: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c  objc > 2) && Tcl
73a0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
73b0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
73c0: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d  2], &verbose) !=
73d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
73e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
73f0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7400: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65  c > 3) && Tcl_Ge
7410: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
7420: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
7430: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   &use_supported)
7440: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
7450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
7470: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
7480: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
7490: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78  m protocol)index
74a0: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  ) {..case TLS_SS
74b0: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  L2:.#if OPENSSL_
74c0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
74d0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
74e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
74f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7500: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20  NSSL_NO_SSL2).. 
7510: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7520: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7530: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7540: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7550: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7560: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7570: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7580: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7590: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
75a0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
75b0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
75c0: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
75d0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
75e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
75f0: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
7600: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
7610: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
7620: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7630: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7640: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7650: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7660: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
7670: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7680: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7690: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53  .    method = SS
76a0: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv3_method(); br
76b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
76c0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
76d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
76e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
76f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7700: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7710: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
7720: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7740: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7750: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7760: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
7770: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
7780: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7790: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
77a0: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74  thod = TLSv1_met
77b0: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
77c0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
77d0: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_1:.#if defin
77e0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
77f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7800: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  _NO_TLS1_1) || d
7810: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7820: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
7830: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7840: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
7850: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
7860: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
7870: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
7880: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7890: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
78a0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
78b0: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f  ethod = TLSv1_1_
78c0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
78d0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
78e0: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65  S_TLS1_2:.#if de
78f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
7900: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7910: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
7920: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7930: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
7940: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
7950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7960: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
7970: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
7980: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7990: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
79a0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
79b0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
79c0: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
79d0: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
79e0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
79f0: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
7a00: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7a10: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
7a20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7a30: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7a40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7a50: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7a60: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7a70: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
7a80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
7a90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7aa0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7ab0: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74  method = TLS_met
7ac0: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f  hod();..    SSL_
7ad0: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
7ae0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
7af0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7b00: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
7b10: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
7b20: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
7b30: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72  ERSION);..    br
7b40: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  eak;.#endif..def
7b50: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f  ault:..    metho
7b60: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29  d = TLS_method()
7b70: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
7b80: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53    }..    ctx = S
7b90: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
7ba0: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20  d);.    if (ctx 
7bb0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7bc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7bd0: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7be0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7bf0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7c00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7c10: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
7c20: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
7c30: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
7c40: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7c50: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52  t(interp, GET_ER
7c60: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
7c70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
7c80: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
7c90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7ca0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7cb0: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
7cc0: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
7cd0: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
7ce0: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
7cf0: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
7d00: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
7d10: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
7d20: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
7d30: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
7d40: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
7d50: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
7d60: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
7d70: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
7d80: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
7d90: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f  rbose) {..    co
7da0: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20  nst char *cp;.. 
7db0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7dc0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7dd0: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7de0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7df0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7e00: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
7e10: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
7e20: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
7e30: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
7e40: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
7e50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
7e60: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7e70: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7e80: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7e90: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7ea0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7eb0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7ec0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7ed0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7ee0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
7ef0: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b  har *) cp, -1));
7f00: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65  ..    }...} else
7f10: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
7f20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7f30: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f  j("",0);..    fo
7f40: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
7f50: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
7f60: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
7f70: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
7f80: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
7f90: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
7fa0: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
7fb0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
7fc0: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73  ../* textual des
7fd0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
7fe0: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28  cipher */...if (
7ff0: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
8000: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73  iption(c, buf, s
8010: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
8020: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
8030: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a  _AppendToObj(obj
8040: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53  Ptr, buf, (Tcl_S
8050: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29  ize) strlen(buf)
8060: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
8070: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
8080: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b  Obj(objPtr, "UNK
8090: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d  NOWN\n", 8);...}
80a0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
80b0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
80c0: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50  ..    sk_SSL_CIP
80d0: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d  HER_free(sk);..}
80e0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
80f0: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
8100: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8110: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
8120: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
8130: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
8140: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
8150: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72  -------. *. * Pr
81a0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d  otocolsObjCmd --
81b0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
81c0: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09  protocols. *. *.
81d0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
81e0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
81f0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70  cess the "tls::p
8200: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e  rotocols" comman
8210: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
8220: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
8230: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
8240: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
8250: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
8260: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8270: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
8280: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
82d0: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  int.ProtocolsObj
82e0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
82f0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8300: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8310: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
8320: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
8330: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
8340: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64  bjPtr;.    (void
8350: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
8360: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
8370: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
8380: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
8390: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
83a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
83b0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
83c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
83d0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
83e0: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72  r();..    objPtr
83f0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
8400: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66  j(0, NULL);..#if
8410: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
8420: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
8430: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
8440: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
8450: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8460: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
8470: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8480: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8490: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
84a0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
84b0: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b  TLS_SSL2], -1));
84c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
84d0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
84e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
84f0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
8500: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8510: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
8520: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8530: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8540: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8550: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8560: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d  tocols[TLS_SSL3]
8570: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8580: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8590: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
85a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
85b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
85c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
85d0: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
85e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
85f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8600: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8610: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
8620: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23  S_TLS1], -1));.#
8630: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
8640: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
8650: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8660: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  L_NO_TLS1_1) && 
8670: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8680: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
8690: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
86a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
86b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
86c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
86d0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
86e0: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_1], -1));.#e
86f0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8700: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
8710: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8720: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  _NO_TLS1_2) && !
8730: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8740: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
8750: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
8760: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8770: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8780: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8790: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
87a0: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_2], -1));.#en
87b0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
87c0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
87d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
87e0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54  NO_TLS1_3).    T
87f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8800: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8810: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8820: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
8830: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20  ls[TLS_TLS1_3], 
8840: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  -1));.#endif..  
8850: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
8860: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
8870: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
8880: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
88e0: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
88f0: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
8900: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
8910: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
8920: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
8930: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
8940: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
8950: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
8960: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
8970: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
8980: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
8990: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
89a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
89b0: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
89c0: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
89d0: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8a20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
8a30: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
8a40: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8a50: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8a60: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8a70: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8a80: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
8a90: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8ab0: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
8ac0: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
8ad0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
8af0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
8b00: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
8b10: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
8b20: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
8b30: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
8b40: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28  t err = 0;.    (
8b50: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
8b60: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8b70: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
8b80: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8b90: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8ba0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8bb0: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
8bc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8bd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
8be0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
8bf0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
8c00: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8c10: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
8c20: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
8c30: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
8c40: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
8c50: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
8c60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8c70: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
8c80: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
8c90: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
8ca0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
8cb0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
8cc0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
8cd0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
8ce0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
8cf0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
8d00: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
8d10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8d20: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
8d30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
8d40: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
8d50: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
8d60: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
8d70: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
8d80: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
8d90: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53  p, "TLS", "HANDS
8da0: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22  HAKE", "CHANNEL"
8db0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
8dc0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
8dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8de0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
8df0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
8e00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
8e10: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
8e20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
8e30: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
8e40: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20  rConnect");.    
8e50: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f  ret = Tls_WaitFo
8e60: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
8e70: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20  r, &err, 1);.   
8e80: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
8e90: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
8ea0: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29  urned: %i", ret)
8eb0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c  ;..    if (ret <
8ec0: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72   0 && ((statePtr
8ed0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
8ee0: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72  L_ASYNC) && (err
8ef0: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a   == EAGAIN))) {.
8f00: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20  .dprintf("Async 
8f10: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41  set and err = EA
8f20: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30  GAIN");..ret = 0
8f30: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
8f40: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e  (ret < 0) {..lon
8f50: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74  g result;..errSt
8f60: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72  r = statePtr->er
8f70: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73  r;..Tcl_ResetRes
8f80: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63  ult(interp);..Tc
8f90: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
8fa0: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c  ...if (!errStr |
8fb0: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  | (*errStr == 0)
8fc0: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20  ) {..    errStr 
8fd0: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  = Tcl_PosixError
8fe0: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54  (interp);..}...T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61  interp, "handsha
9010: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72  ke failed: ", er
9020: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e  rStr, (char *) N
9030: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75  ULL);..if ((resu
9040: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  lt = SSL_get_ver
9050: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
9060: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35  Ptr->ssl)) != X5
9070: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20  09_V_OK) {..    
9080: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9090: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74  (interp, " due t
90a0: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69  o \"", X509_veri
90b0: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
90c0: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c  ring(result), "\
90d0: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
90e0: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45  L);..}..Tcl_SetE
90f0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
9100: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
9110: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
9120: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
9130: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
9140: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
9150: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
9160: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
9170: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9180: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ROR;.    } else 
9190: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  {..if (err != 0)
91a0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
91b0: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69  "Got an error wi
91c0: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68  th a completed h
91d0: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20  andshake: err = 
91e0: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72  %i", err);..}..r
91f0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  et = 1;.    }.. 
9200: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
9210: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74  rning TCL_OK wit
9220: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20  h data \"%i\"", 
9230: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ret);.    Tcl_Se
9240: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
9250: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
9260: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75  (ret));.    retu
9270: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9280: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70  ------. *. * Imp
92d0: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
92e0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
92f0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
9300: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c  process the "ssl
9310: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09  " command. *. *.
9320: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20  The ssl command 
9330: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20  pushes SSL over 
9340: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74  a (newly connect
9350: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20  ed) tcp socket. 
9360: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
9370: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
9380: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
9390: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
93a0: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
93b0: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
93c0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9410: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
9420: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  .ImportObjCmd(Cl
9430: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
9440: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
9450: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
9460: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
9470: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
9480: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
9490: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
94a0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
94b0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
94c0: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
94d0: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
94e0: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
94f0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09     SSL_CTX *ctx.
9500: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9510: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20  _Obj *script..= 
9520: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9530: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e  j *password..= N
9540: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9550: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a   *vcmd..= NULL;.
9560: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
9570: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
9580: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
9590: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
95a0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
95b0: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
95c0: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
95d0: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53  t idx;.    Tcl_S
95e0: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  ize len;.    int
95f0: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54   flags...= TLS_T
9600: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
9610: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f   server...= 0;./
9620: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
9630: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
9640: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
9650: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55  r *keyfile..= NU
9660: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
9670: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  rtfile..= NULL;.
9680: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9690: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a  r *key..= NULL;.
96a0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
96b0: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75  _len..= 0;.    u
96c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
96d0: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rt..= NULL;.    
96e0: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
96f0: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  n..= 0;.    char
9700: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c   *ciphers..= NUL
9710: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
9720: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c  hersuites..= NUL
9730: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
9740: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
9750: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d   char *CApath..=
9760: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9770: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c  *DHparams..= NUL
9780: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64  L;.    char *mod
9790: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  el...= NULL;.   
97a0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
97b0: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f  e..= NULL;./* ho
97c0: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65  stname for Serve
97d0: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f  r Name Indicatio
97e0: 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73  n */.    char *s
97f0: 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c  ession_id..= NUL
9800: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9810: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  alpn..= NULL;.  
9820: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20    int ssl2 = 0, 
9830: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ssl3 = 0;.    in
9840: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31  t tls1 = 1, tls1
9850: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d  _1 = 1, tls1_2 =
9860: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a   1, tls1_3 = 1;.
9870: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20      int proto = 
9880: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20  0, level = -1;. 
9890: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20     int verify = 
98a0: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20  0, require = 0, 
98b0: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73  request = 1, pos
98c0: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b  t_handshake = 0;
98d0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
98e0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
98f0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
9900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9910: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
9920: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9930: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a  ).    tls1 = 0;.
9940: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9950: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
9960: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
9970: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
9980: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64  tls1_1 = 0;.#end
9990: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
99a0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
99b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
99c0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31  TLS1_2).    tls1
99d0: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _2 = 0;.#endif.#
99e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
99f0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
9a00: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9a10: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d  _3).    tls1_3 =
9a20: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
9a30: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
9a40: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
9a50: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
9a60: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74  v, "channel ?opt
9a70: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  ions?");..return
9a80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9a90: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
9aa0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
9ab0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
9ac0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
9ad0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
9ae0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
9af0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
9b00: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
9b10: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
9b20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
9b30: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
9b40: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
9b50: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
9b60: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
9b70: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
9b80: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28  han);..    for (
9b90: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f  idx = 2; idx < o
9ba0: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63  bjc; idx++) {..c
9bb0: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47  har *opt = Tcl_G
9bc0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64  etString(objv[id
9bd0: 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  x]);...if (opt[0
9be0: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
9bf0: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22  reak;...OPTOBJ("
9c00: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09  -alpn", alpn);..
9c10: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c  OPTSTR("-cadir",
9c20: 20 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54   CApath);..OPTST
9c30: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66  R("-cafile", CAf
9c40: 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22  ile);..OPTBYTE("
9c50: 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65  -cert", cert, ce
9c60: 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52  rt_len);..OPTSTR
9c70: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65  ("-certfile", ce
9c80: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  rtfile);..OPTSTR
9c90: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68  ("-cipher", ciph
9ca0: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ers);..OPTSTR("-
9cb0: 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72  ciphers", cipher
9cc0: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  s);..OPTSTR("-ci
9cd0: 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70  phersuites", cip
9ce0: 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54  hersuites);..OPT
9cf0: 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20  OBJ("-command", 
9d00: 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52  script);..OPTSTR
9d10: 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48  ("-dhparams", DH
9d20: 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54  params);..OPTBYT
9d30: 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b  E("-key", key, k
9d40: 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52  ey_len);..OPTSTR
9d50: 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79  ("-keyfile", key
9d60: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
9d70: 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b  -model", model);
9d80: 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77  ..OPTOBJ("-passw
9d90: 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b  ord", password);
9da0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74  ..OPTBOOL("-post
9db0: 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73  _handshake", pos
9dc0: 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f  t_handshake);..O
9dd0: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74  PTBOOL("-request
9de0: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50  ", request);..OP
9df0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22  TBOOL("-require"
9e00: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54  , require);..OPT
9e10: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c  INT("-security_l
9e20: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09  evel", level);..
9e30: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72  OPTBOOL("-server
9e40: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54  ", server);..OPT
9e50: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65  STR("-servername
9e60: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a  ", servername);.
9e70: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f  .OPTSTR("-sessio
9e80: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69  n_id", session_i
9e90: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  d);..OPTBOOL("-s
9ea0: 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50  sl2", ssl2);..OP
9eb0: 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73  TBOOL("-ssl3", s
9ec0: 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl3);..OPTBOOL("
9ed0: 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09  -tls1", tls1);..
9ee0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31  OPTBOOL("-tls1.1
9ef0: 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54  ", tls1_1);..OPT
9f00: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20  BOOL("-tls1.2", 
9f10: 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f  tls1_2);..OPTBOO
9f20: 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73  L("-tls1.3", tls
9f30: 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  1_3);..OPTOBJ("-
9f40: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
9f50: 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a  , vcmd);..OPTOBJ
9f60: 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b  ("-vcmd", vcmd);
9f70: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f  ...OPTBAD("optio
9f80: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64  n", "-alpn, -cad
9f90: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65  ir, -cafile, -ce
9fa0: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d  rt, -certfile, -
9fb0: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73  cipher, -ciphers
9fc0: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c  uites, -command,
9fd0: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79   -dhparams, -key
9fe0: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64  , -keyfile, -mod
9ff0: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d  el, -password, -
a000: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20  post_handshake, 
a010: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69  -request, -requi
a020: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65  re, -security_le
a030: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73  vel, -server, -s
a040: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73  ervername, -sess
a050: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d  ion_id, -ssl2, -
a060: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c  ssl3, -tls1, -tl
a070: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d  s1.1, -tls1.2, -
a080: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69  tls1.3, or -vali
a090: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a  datecommand");..
a0a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
a0b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
a0c0: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66  (request)..verif
a0d0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
a0e0: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53  CLIENT_ONCE | SS
a0f0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20  L_VERIFY_PEER;. 
a100: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
a110: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66  & require).verif
a120: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
a130: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
a140: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65  CERT;.    if (re
a150: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
a160: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20  ndshake).verify 
a170: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f  |= SSL_VERIFY_PO
a180: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20  ST_HANDSHAKE;.  
a190: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20    if (verify == 
a1a0: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c  0)..verify = SSL
a1b0: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20  _VERIFY_NONE;.. 
a1c0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
a1d0: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  2 ? TLS_PROTO_SS
a1e0: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L2 : 0);.    pro
a1f0: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c  to |= (ssl3 ? TL
a200: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30  S_PROTO_SSL3 : 0
a210: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a220: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54  (tls1 ? TLS_PROT
a230: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20  O_TLS1 : 0);.   
a240: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
a250: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  1 ? TLS_PROTO_TL
a260: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  S1_1 : 0);.    p
a270: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20  roto |= (tls1_2 
a280: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
a290: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _2 : 0);.    pro
a2a0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20  to |= (tls1_3 ? 
a2b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
a2c0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72   : 0);..    /* r
a2d0: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20  eset to NULL if 
a2e0: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f  blank string pro
a2f0: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20  vided */.    if 
a300: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29  (cert && !*cert)
a310: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20  ..        cert. 
a320: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a330: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a     if (key && !*
a340: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65  key)..        ke
a350: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  y.        = NULL
a360: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69  ;.    if (certfi
a370: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65  le && !*certfile
a380: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69  )         certfi
a390: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  le.= NULL;.    i
a3a0: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a  f (keyfile && !*
a3b0: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c  keyfile)..keyfil
a3c0: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
a3d0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ;.    if (cipher
a3e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09  s && !*ciphers).
a3f0: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09          ciphers.
a400: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a410: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75      if (ciphersu
a420: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72  ites && !*cipher
a430: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75  suites) ciphersu
a440: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a  ites    = NULL;.
a450: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26      if (CAfile &
a460: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20  & !*CAfile).    
a470: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20      CAfile.     
a480: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a490: 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43  f (CApath && !*C
a4a0: 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43  Apath).        C
a4b0: 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20  Apath.        = 
a4c0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48  NULL;.    if (DH
a4d0: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61  params && !*DHpa
a4e0: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48  rams).        DH
a4f0: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20  params        = 
a500: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
a510: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
a520: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
a530: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  State *) ckalloc
a540: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65  ((unsigned) size
a550: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20  of(State));.    
a560: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c  memset(statePtr,
a570: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65   0, sizeof(State
a580: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  ));..    statePt
a590: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73  r->flags.= flags
a5a0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a5b0: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b  interp.= interp;
a5c0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
a5d0: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a  flags.= verify;.
a5e0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
a5f0: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20  r.= "";..    /* 
a600: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20  allocate script 
a610: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70  */.    if (scrip
a620: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  t) {..(void) Tcl
a630: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a640: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b  j(script, &len);
a650: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
a660: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c    statePtr->call
a670: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09  back = script;..
a680: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a690: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
a6a0: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20  allback);..}.   
a6b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
a6c0: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a  ate password */.
a6d0: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64      if (password
a6e0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
a6f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a700: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29  (password, &len)
a710: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
a720: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73     statePtr->pas
a730: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64  sword = password
a740: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
a750: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a760: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a  ->password);..}.
a770: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
a780: 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20  locate validate 
a790: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69  command */.    i
a7a0: 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69  f (vcmd) {..(voi
a7b0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a7c0: 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c  FromObj(vcmd, &l
a7d0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
a7e0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a7f0: 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20  vcmd = vcmd;..  
a800: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a810: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  nt(statePtr->vcm
a820: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
a830: 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e    if (model != N
a840: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65  ULL) {..int mode
a850: 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d  ;../* Get the "m
a860: 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f  odel" context */
a870: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
a880: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
a890: 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09  model, &mode);..
a8a0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
a8b0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
a8c0: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
a8d0: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
a8e0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a8f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a900: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  OR;..}.../*.. * 
a910: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
a920: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
a930: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f  ost channel.. */
a940: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
a950: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
a960: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68  ;..if (Tcl_GetCh
a970: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
a980: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
a990: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  pe()) {..    Tcl
a9a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a9b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
a9c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
a9d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
a9e0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
a9f0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
aa00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
aa10: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
aa20: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
aa30: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
aa40: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
aa50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
aa60: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
aa70: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
aa80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
aa90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aaa0: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28  OR;..}..ctx = ((
aab0: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
aac0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
aad0: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a  ta(chan))->ctx;.
aae0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
aaf0: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69   ((ctx = CTX_Ini
ab00: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76  t(statePtr, serv
ab10: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69  er, proto, keyfi
ab20: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65  le, certfile, ke
ab30: 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e  y, cert, key_len
ab40: 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c  ,..    cert_len,
ab50: 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c 65 2c   CApath, CAfile,
ab60: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
ab70: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44  suites, level, D
ab80: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c  Hparams)) == NUL
ab90: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
aba0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
abb0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
abc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
abd0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
abe0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
abf0: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
ac00: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
ac10: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ac20: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77  at the channel w
ac30: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28  orks in binary (
ac40: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65  for the.     * e
ac50: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
ac60: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
ac70: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
ac80: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
ac90: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
aca0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
acb0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
acc0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
acd0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
ace0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
acf0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
ad00: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ad10: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ad20: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
ad30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
ad40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ad50: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
ad60: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
ad70: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
ad80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ad90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
ada0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
adb0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
adc0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
add0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ade0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
adf0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
ae00: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
ae10: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ae20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ae30: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
ae40: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
ae50: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
ae60: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ae70: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ae80: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ae90: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
aea0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
aeb0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aec0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
aed0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
aee0: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
aef0: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
af00: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
af10: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
af20: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
af30: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
af40: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
af50: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
af60: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
af70: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52  tatePtr,..(TCL_R
af80: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
af90: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
afa0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
afb0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
afc0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
afd0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
afe0: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
aff0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
b000: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
b010: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
b020: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
b030: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
b040: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
b050: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
b060: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
b070: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
b080: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
b090: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
b0a0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
b0b0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c  anslation);..Tcl
b0c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b0d0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b0e0: 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  ng);..Tcl_DStrin
b0f0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b100: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63  nelEOFChar);..Tc
b110: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b120: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b130: 69 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ing);..return TC
b140: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
b150: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b160: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b170: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b180: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
b190: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b1a0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
b1b0: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20  ranslation));.  
b1c0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b1d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b1e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b1f0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f  -encoding", Tcl_
b200: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b210: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b220: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ng));.    Tcl_Se
b230: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b240: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b250: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72  >self, "-eofchar
b260: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
b270: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
b280: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20  lEOFChar));.    
b290: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b2a0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b2b0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62  tePtr->self, "-b
b2c0: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53  locking", Tcl_DS
b2d0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
b2e0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b2f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ));.    Tcl_DStr
b300: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b310: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b320: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b330: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b340: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
b350: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b360: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b370: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
b380: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b390: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b3a0: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ing);..    /*.  
b3b0: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c     * SSL Initial
b3c0: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a  ization.     */.
b3d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73      statePtr->ss
b3e0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74  l = SSL_new(stat
b3f0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
b400: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73  if (!statePtr->s
b410: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69  sl) {../* SSL li
b420: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09  brary error */..
b430: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b440: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e  (interp, "couldn
b450: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c  't construct ssl
b460: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54   session: ", GET
b470: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b480: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b490: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b4a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b4b0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49  S", "IMPORT", "I
b4c0: 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  NIT", "FAILED", 
b4d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b4e0: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66  .Tls_Free((tls_f
b4f0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b500: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
b510: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b520: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74  .    /* Set host
b530: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
b540: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61      if (serverna
b550: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74  me) {../* Sets t
b560: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69  he server name i
b570: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20  ndication (SNI) 
b580: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65  in ClientHello e
b590: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20  xtension */../* 
b5a0: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f  Per RFC 6066, ho
b5b0: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49  stname is a ASCI
b5c0: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  I encoded string
b5d0: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36  , though RFC 436
b5e0: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f  6 says UTF-8. */
b5f0: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74  ..if (!SSL_set_t
b600: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28  lsext_host_name(
b610: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
b620: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65  ervername) && re
b630: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63  quire) {..    Tc
b640: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b650: 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20  nterp, "Set SNI 
b660: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64  extension failed
b670: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b680: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b690: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b6a0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b6b0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b6c0: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41  ORT", "SNI", "FA
b6d0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b6e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b6f0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b700: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b710: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b720: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
b730: 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f   Set hostname fo
b740: 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61  r peer certifica
b750: 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69  te hostname veri
b760: 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65  fication in clie
b770: 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75  nts...   Don't u
b780: 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74  se SSL_set1_host
b790: 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69   since it has li
b7a0: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69  mitations. */..i
b7b0: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73  f (!SSL_add1_hos
b7c0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  t(statePtr->ssl,
b7d0: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a   servername)) {.
b7e0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b7f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
b800: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20  et DNS hostname 
b810: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b820: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b830: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b840: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b850: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b860: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53  , "IMPORT", "HOS
b870: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22  TNAME", "FAILED"
b880: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b890: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
b8a0: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
b8b0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b8c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b8d0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b8e0: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73    /* Resume sess
b8f0: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66  ion id */.    if
b900: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20   (session_id && 
b910: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b920: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49  d) <= SSL_MAX_SI
b930: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a  D_CTX_LENGTH) {.
b940: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73  ./* SSL_set_sess
b950: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53  ion() */..if (!S
b960: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f  SL_SESSION_set1_
b970: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67  id_context(SSL_g
b980: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65  et_session(state
b990: 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f  Ptr->ssl),...(co
b9a0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
b9b0: 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c  r *) session_id,
b9c0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
b9d0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b9e0: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  d))) {..    Tcl_
b9f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ba00: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73  erp, "Resume ses
ba10: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20  sion failed: ", 
ba20: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
ba30: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ba40: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
ba50: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
ba60: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
ba70: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49   "SESSION", "FAI
ba80: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
ba90: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
baa0: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
bab0: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
bac0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
bad0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
bae0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20  ..    /* Enable 
baf0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65  Application-Laye
bb00: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  r Protocol Negot
bb10: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73  iation. Examples
bb20: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a   are: http/1.0,.
bb30: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  .http/1.1, h2, h
bb40: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f  3, ftp, imap, po
bb50: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c  p3, xmpp-client,
bb60: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71   xmpp-server, mq
bb70: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f  tt, irc, etc. */
bb80: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b  .    if (alpn) {
bb90: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
bba0: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
bbb0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
bbc0: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
bbd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bbe0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
bbf0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
bc00: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
bc10: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
bc20: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
bc30: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
bc40: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
bc50: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26  (interp, alpn, &
bc60: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54  cnt, &list) != T
bc70: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c  CL_OK) {..    Tl
bc80: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
bc90: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
bca0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
bcb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
bcc0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
bcd0: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
bce0: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f   for the protoco
bcf0: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28  l-list */..for (
bd00: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20  i = 0; i < cnt; 
bd10: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  i++) {..    Tcl_
bd20: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bd30: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
bd40: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20  ..    if (len > 
bd50: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  255) {...Tcl_App
bd60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bd70: 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  , "ALPN protocol
bd80: 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22   names too long"
bd90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bda0: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  ;...Tcl_SetError
bdb0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
bdc0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
bdd0: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
bde0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
bdf0: 09 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f  ..Tls_Free((tls_
be00: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
be10: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
be20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
be30: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
be40: 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20  en += 1 + (int) 
be50: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69  len;..}.../* Bui
be60: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ld the complete 
be70: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
be80: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c  ..protos = ckall
be90: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a  oc(protos_len);.
bea0: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ./* protocol-lis
beb0: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d  ts consist of 8-
bec0: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69  bit length-prefi
bed0: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67  xed, byte string
bee0: 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30  s */..for (j = 0
bef0: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20  , p = protos; j 
bf00: 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20  < cnt; j++) {.. 
bf10: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54     char *str = T
bf20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
bf30: 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65  Obj(list[j], &le
bf40: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20  n);..    *p++ = 
bf50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20  (unsigned char) 
bf60: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79  len;..    memcpy
bf70: 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74  (p, str, (size_t
bf80: 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b  ) len);..    p +
bf90: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  = len;..}.../* S
bfa0: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
bfb0: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20  os makes a copy 
bfc0: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d  of the protocol-
bfd0: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65  list */../* Note
bfe0: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
bff0: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74  reverses the ret
c000: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e  urn value conven
c010: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c  tion */..if (SSL
c020: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
c030: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c040: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c  protos, protos_l
c050: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  en)) {..    Tcl_
c060: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c070: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70  erp, "Set ALPN p
c080: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a  rotocols failed:
c090: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
c0a0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
c0b0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
c0c0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
c0d0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
c0e0: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
c0f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
c100: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
c110: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
c120: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
c130: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
c140: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
c150: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
c160: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
c170: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
c180: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c190: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
c1a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c1b0: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
c1c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
c1d0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
c1e0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
c1f0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
c200: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
c210: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
c220: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
c230: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
c240: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c250: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c260: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
c270: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c  to us */.    SSL
c280: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
c290: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
c2a0: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
c2b0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  k);.    SSL_set_
c2c0: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
c2d0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66  atePtr->ssl, Inf
c2e0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20  oCallback);..   
c2f0: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72   /* Callback for
c300: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f   observing proto
c310: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  col messages */.
c320: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
c330: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20  NO_SSL_TRACE.   
c340: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58   /* void SSL_CTX
c350: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c360: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c370: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c380: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64  tePtr);.    void
c390: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
c3a0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c3b0: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65  tr->ctx, Message
c3c0: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20  Callback); */.  
c3d0: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
c3e0: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
c3f0: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
c400: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
c410: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c420: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c430: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ssl, MessageCall
c440: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  back);.#endif.. 
c450: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
c460: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
c470: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
c480: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
c490: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
c4a0: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
c4b0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
c4c0: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
c4d0: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
c4e0: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
c4f0: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61  /* Server callba
c500: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  cks */..SSL_CTX_
c510: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c520: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50  rname_arg(stateP
c530: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a  tr->ctx, (void *
c540: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
c550: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
c560: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62  servername_callb
c570: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
c580: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b  x, SNICallback);
c590: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
c5a0: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74  ient_hello_cb(st
c5b0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c  atePtr->ctx, Hel
c5c0: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  loCallback, (voi
c5d0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c5e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c5f0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  otos != NULL) {.
c600: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c610: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28  _alpn_select_cb(
c620: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
c630: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
c640: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c650: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c660: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d      if (tls1_2 =
c670: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c680: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f   0) {...SSL_CTX_
c690: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f  set_next_protos_
c6a0: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74  advertised_cb(st
c6b0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e  atePtr->ctx, NPN
c6c0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
c6d0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
c6e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09    }.#endif..}...
c6f0: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72  /* Enable server
c700: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65   to send cert re
c710: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64  quest after hand
c720: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f  shake (TLS 1.3 o
c730: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72  nly) */../* A wr
c740: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75  ite operation mu
c750: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f  st take place fo
c760: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74  r the Certificat
c770: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a  e Request to be.
c780: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20  .   sent to the 
c790: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e  client, this can
c7a0: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53   be done with SS
c7b0: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29  L_do_handshake()
c7c0: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
c7d0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
c7e0: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b  ake && tls1_3) {
c7f0: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79  ..    SSL_verify
c800: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e  _client_post_han
c810: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d  dshake(statePtr-
c820: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73  >ssl);..}.../* s
c830: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72  et automatic cur
c840: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a  ve selection */.
c850: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75  .SSL_set_ecdh_au
c860: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  to(statePtr->ssl
c870: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73  , 1);.../* Set s
c880: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
c890: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
c8a0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
c8b0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
c8c0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c8d0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
c8e0: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
c8f0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
c900: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
c910: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c920: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
c930: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c940: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
c950: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c960: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
c970: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c980: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c990: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c9a0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
c9b0: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
c9c0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
c9d0: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
c9e0: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
c9f0: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
ca00: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
ca10: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
ca20: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
ca30: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
ca40: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
ca50: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
ca60: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
ca70: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
ca80: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
ca90: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
caa0: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
cab0: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
cac0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
cad0: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
cae0: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
caf0: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
cb00: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
cb10: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
cb20: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
cb30: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
cb40: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
cb50: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73  .    }.    SSL_s
cb60: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d  et_bio(statePtr-
cb70: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e  >ssl, statePtr->
cb80: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  p_bio, statePtr-
cb90: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f  >p_bio);.    BIO
cba0: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74  _set_ssl(statePt
cbb0: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72  r->bio, statePtr
cbc0: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  ->ssl, BIO_NOCLO
cbd0: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  SE);..    /*.   
cbe0: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49    * End of SSL I
cbf0: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nit.     */.    
cc00: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
cc10: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ng %s", Tcl_GetC
cc20: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
cc30: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
cc40: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
cc50: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20  nterp, (char *) 
cc60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cc70: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
cc80: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
cc90: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
cca0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f  ---. *. * Unimpo
cd00: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
cd10: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
cd20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
cd30: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73  emove the topmos
cd40: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72  t channel filter
cd50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
cd60: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
cd70: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
cd80: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
cd90: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
cda0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
cdb0: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
cdc0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
ce10: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  int.UnimportObjC
ce20: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
ce30: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
ce40: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
ce50: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
ce60: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
ce70: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
ce80: 20 63 68 61 6e 2c 20 63 68 69 6c 64 3b 09 2f 2a   chan, child;./*
ce90: 20 54 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64   The stacked and
cea0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
ceb0: 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nels */.    Tcl_
cec0: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61  DString upperCha
ced0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c  nnelTranslation,
cee0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f   upperChannelBlo
cef0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  cking, upperChan
cf00: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70  nelEncoding, upp
cf10: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
cf20: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  ;.    int res = 
cf30: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69  TCL_OK;.    (voi
cf40: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
cf50: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
cf60: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
cf70: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
cf80: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cf90: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
cfa0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
cfb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c     }..    /* Val
cfd0: 69 64 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61  idate channel na
cfe0: 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  me */.    chan =
cff0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
d000: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
d010: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
d020: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
d030: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
d040: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
d050: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d060: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
d070: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
d080: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
d090: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
d0a0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
d0b0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
d0c0: 0a 20 20 20 20 63 68 69 6c 64 20 3d 20 54 63 6c  .    child = Tcl
d0d0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
d0e0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  el(chan);..    /
d0f0: 2a 20 56 65 72 69 66 79 20 69 73 20 61 20 73 74  * Verify is a st
d100: 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f  acked channel */
d110: 0a 20 20 20 20 69 66 20 28 63 68 69 6c 64 20 3d  .    if (child =
d120: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
d130: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d140: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
d150: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
d160: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
d170: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 73 74 61  .."\": not a sta
d180: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 2c 20 28  cked channel", (
d190: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d1a0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
d1b0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
d1c0: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20  S", "UNIMPORT", 
d1d0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
d1e0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
d1f0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
d200: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
d210: 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e 79      /* Flush any
d220: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
d230: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46 6c 75  .    if (Tcl_Flu
d240: 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f  sh(chan) != TCL_
d250: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
d260: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
d270: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
d280: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
d290: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
d2a0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
d2b0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
d2c0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
d2d0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d2e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
d2f0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  har);.    Tcl_DS
d300: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
d310: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d320: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 75  ;..    /* Get cu
d330: 72 72 65 6e 74 20 63 6f 6e 66 69 67 20 2d 20 45  rrent config - E
d340: 4f 4c 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  OL translation, 
d350: 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20 62 75 66  encoding and buf
d360: 66 65 72 69 6e 67 20 6f 70 74 69 6f 6e 73 20 61  fering options a
d370: 72 65 20 73 68 61 72 65 64 20 62 65 74 77 65 65  re shared betwee
d380: 6e 20 61 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 69  n all channels i
d390: 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20  n the stack */. 
d3a0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
d3b0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d3c0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
d3d0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d3e0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
d3f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
d400: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
d410: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
d420: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
d430: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
d440: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d450: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d460: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
d470: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d480: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
d490: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d4a0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
d4b0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
d4c0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
d4d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61  );..    /* Unsta
d4e0: 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61  ck the channel a
d4f0: 6e 64 20 72 65 73 74 6f 72 65 20 75 6e 64 65 72  nd restore under
d500: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 63 6f  lying channel co
d510: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 69 66 20 28  nfig */.    if (
d520: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e  Tcl_UnstackChann
d530: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
d540: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   == TCL_OK) {..T
d550: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
d560: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c  ion(interp, chil
d570: 64 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  d, "-encoding", 
d580: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
d590: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
d5a0: 63 6f 64 69 6e 67 29 29 3b 0a 09 54 63 6c 5f 53  coding));..Tcl_S
d5b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d5c0: 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22  interp, child, "
d5d0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
d5e0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
d5f0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
d600: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e  ));..Tcl_SetChan
d610: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d620: 2c 20 63 68 69 6c 64 2c 20 22 2d 74 72 61 6e 73  , child, "-trans
d630: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
d640: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d650: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d660: 6f 6e 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68  on));..Tcl_SetCh
d670: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d680: 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 62 6c 6f  rp, child, "-blo
d690: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  cking", Tcl_DStr
d6a0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
d6b0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29  hannelBlocking))
d6c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
d6d0: 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  res = TCL_ERROR;
d6e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
d6f0: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54  lean-up */.    T
d700: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d710: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
d720: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
d730: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
d740: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
d750: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
d760: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d770: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d780: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d790: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d7a0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
d7b0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
d7c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
d7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
d810: 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73  CTX_Init -- cons
d820: 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20  truct a SSL_CTX 
d830: 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52  instance. *. * R
d840: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c  esults:. *.A val
d850: 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61  id SSL_CTX insta
d860: 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a  nce or NULL.. *.
d870: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
d880: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53  . *.constructs S
d890: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
d8a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
d8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
d8f0: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43  atic SSL_CTX *.C
d900: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
d910: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
d920: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
d930: 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c  , char *keyfile,
d940: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c   char *certfile,
d950: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
d960: 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65  ar *key, unsigne
d970: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63  d char *cert, Tc
d980: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20  l_Size key_len, 
d990: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
d9a0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
d9b0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
d9c0: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
d9d0: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
d9e0: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
d9f0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
da00: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
da10: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
da20: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
da30: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
da40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
da50: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69  String ds;.    i
da60: 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72  nt off = 0, abor
da70: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  t = 0;.    int l
da80: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b  oad_private_key;
da90: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
daa0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
dab0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
dac0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
dad0: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41  !proto) {..Tcl_A
dae0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
daf0: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72  rp, "no valid pr
db00: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22  otocol selected"
db10: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
db20: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
db30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
db40: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
db50: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
db60: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
db70: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
db80: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
db90: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
dba0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
dbb0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
dbc0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
dbd0: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
dbe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dbf0: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
dc00: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
dc10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
dc20: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
dc30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
dc40: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
dc50: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
dc60: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
dc70: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
dc80: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
dc90: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
dca0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dcb0: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
dcc0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
dcd0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dce0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
dcf0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
dd00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
dd10: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
dd20: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
dd30: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dd40: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dd50: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
dd60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dd70: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f  "TLS 1.0 protoco
dd80: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
dd90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
dda0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
ddb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
ddc0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
ddd0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
dde0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
ddf0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
de00: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
de10: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
de20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
de30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
de40: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
de50: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
de60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
de70: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
de80: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
de90: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
dea0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
deb0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
dec0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
ded0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
dee0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
def0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
df00: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
df10: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
df20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
df30: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
df40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
df50: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
df60: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
df70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
df80: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
df90: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dfa0: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
dfb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dfc0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
dfd0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
dfe0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
dff0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
e000: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
e010: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f  ndif.    if (pro
e020: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55  to == 0) {../* U
e030: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f  se full range */
e040: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
e050: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
e060: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54  ctx, 0);..SSL_CT
e070: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
e080: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
e090: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
e0a0: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
e0b0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
e0c0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
e0d0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
e0e0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
e0f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e100: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
e110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
e120: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e130: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
e140: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
e150: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
e160: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e170: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e180: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
e190: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e1a0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
e1b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
e1c0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
e1d0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
e1e0: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
e1f0: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
e200: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
e210: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
e220: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
e230: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e240: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
e250: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e260: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
e270: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e280: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
e290: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
e2a0: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
e2b0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
e2c0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
e2d0: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
e2e0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
e2f0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
e300: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
e310: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e320: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
e330: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e340: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
e350: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
e360: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
e370: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e380: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
e390: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
e3a0: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
e3b0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
e3c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e3d0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
e3e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e3f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
e400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e410: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
e420: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
e430: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
e440: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e450: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
e460: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e470: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
e480: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
e490: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e4a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
e4b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e4c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
e4d0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
e4e0: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
e4f0: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
e500: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
e510: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
e520: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
e530: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
e540: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
e550: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
e560: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
e570: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e580: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
e590: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
e5a0: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
e5b0: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
e5c0: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
e5d0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
e5e0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e5f0: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
e600: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
e610: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e620: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
e630: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
e640: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
e650: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
e660: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
e670: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e680: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
e690: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
e6a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e6b0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
e6c0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e6d0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
e6e0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
e6f0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
e700: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
e710: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
e720: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e730: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
e740: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e750: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
e760: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e770: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
e780: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
e790: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
e7a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e7b0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
e7c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e7d0: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
e7e0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e7f0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
e800: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e810: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
e820: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e830: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e840: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e850: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
e860: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e870: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
e880: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
e890: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
e8a0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e8b0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
e8c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e8d0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
e8e0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
e8f0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e900: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
e910: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
e920: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
e930: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
e940: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
e950: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
e960: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
e970: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
e980: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e990: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76  ..    if (getenv
e9a0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29  (SSLKEYLOGFILE))
e9b0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
e9c0: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28  keylog_callback(
e9d0: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  ctx, KeyLogCallb
e9e0: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ack);.    }..#if
e9f0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ea00: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
ea10: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ea20: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74  _3).    if (prot
ea30: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  o == TLS_PROTO_T
ea40: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54  LS1_3) {..SSL_CT
ea50: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
ea60: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
ea70: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53  1_3_VERSION);..S
ea80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
ea90: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
eaa0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
eab0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
eac0: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69  .    /* Force ci
ead0: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f  pher selection o
eae0: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a  rder by server *
eaf0: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72  /.    if (!isSer
eb00: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ver) {..SSL_CTX_
eb10: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
eb20: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53   SSL_OP_CIPHER_S
eb30: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45  ERVER_PREFERENCE
eb40: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  );.    }..#if OP
eb50: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
eb60: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
eb70: 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61  0L.    OpenSSL_a
eb80: 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d  dd_all_algorithm
eb90: 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70  s(); /* Load cip
eba0: 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73  hers and digests
ebb0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   */.#endif..    
ebc0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
ebd0: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
ebe0: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
ebf0: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
ec00: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
ec10: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
ec20: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
ec30: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
ec40: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
ec50: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
ec60: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
ec70: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53  L_OP_NO_COMPRESS
ec80: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65  ION);./* disable
ec90: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65   compression eve
eca0: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a  n if supported *
ecb0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
ecc0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f  t_options(ctx, o
ecd0: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65  ff);../* disable
ece0: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
ecf0: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ns */.#if OPENSS
ed00: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
ed10: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   < 0x10101000L. 
ed20: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
ed30: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
ed40: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f  E_AUTO_RETRY);./
ed50: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e  * handle new han
ed60: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67  dshakes in backg
ed70: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66  round. On by def
ed80: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20  ault in OpenSSL 
ed90: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66  1.1.1. */.#endif
eda0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
edb0: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
edc0: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
edd0: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
ede0: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
edf0: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
ee00: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
ee10: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
ee20: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
ee30: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
ee40: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
ee50: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
ee60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ee70: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
ee80: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
ee90: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
eea0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
eeb0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
eec0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
eed0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
eee0: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
eef0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
ef00: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
ef10: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
ef20: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
ef30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ef40: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
ef50: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
ef60: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
ef70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
ef80: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ef90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
efa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
efb0: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
efc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65   */.    if (leve
efd0: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20  l > -1 && level 
efe0: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73  < 6) {../* SSL_s
eff0: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
f000: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  l */..SSL_CTX_se
f010: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
f020: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20  (ctx, level);.  
f030: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
f040: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a  some callbacks *
f050: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
f060: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
f070: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72  _cb(ctx, Passwor
f080: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  dCallback);.    
f090: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f0a0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73  ult_passwd_cb_us
f0b0: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  erdata(ctx, (voi
f0c0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a  d *)statePtr);..
f0d0: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69      /* read a Di
f0e0: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72  ffie-Hellman par
f0f0: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72  ameters file, or
f100: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   use the built-i
f110: 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c  n one */.    Tcl
f120: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
f130: 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  );.#ifdef OPENSS
f140: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
f150: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f160: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f170: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
f180: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
f190: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
f1a0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
f1b0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
f1c0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
f1d0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
f1e0: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
f1f0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
f200: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
f210: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62  IO *bio;...    b
f220: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c  io = BIO_new_fil
f230: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20  e(F2N(DHparams, 
f240: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20  &ds), "r");..   
f250: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54   if (!bio) {...T
f260: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f270: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  ds);...Tcl_Appen
f280: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f290: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20  "Could not find 
f2a0: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69  DH parameters fi
f2b0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
f2c0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
f2d0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
f2e0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
f2f0: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
f300: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
f310: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
f320: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
f330: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
f340: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
f350: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
f360: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
f370: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f380: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65  p, "Could not re
f390: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  ad DH parameters
f3a0: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68   from file", (ch
f3b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
f3c0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f3d0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f3e0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c  ..    }..    SSL
f3f0: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
f400: 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44  ctx, dh);..    D
f410: 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20  H_free(dh);...} 
f420: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55  else {..    /* U
f430: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48  se well known DH
f440: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
f450: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73   have built-in s
f460: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53  upport in OpenSS
f470: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53  L */..    if (!S
f480: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75  SL_CTX_set_dh_au
f490: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09  to(ctx, 1)) {...
f4a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f4b0: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
f4c0: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44  not enable set D
f4d0: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45  H auto: ", GET_E
f4e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
f4f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
f500: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f510: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f520: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
f530: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f540: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63  set our certific
f550: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f  ate */.    load_
f560: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b  private_key = 0;
f570: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
f580: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  e != NULL) {..lo
f590: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
f5a0: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54   1;...if (SSL_CT
f5b0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
f5c0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
f5d0: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
f5e0: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
f5f0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
f600: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f610: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
f620: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f630: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
f640: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
f650: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
f660: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
f670: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f680: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
f690: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f6a0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
f6b0: 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72  LL;..}..Tcl_DStr
f6c0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20  ingFree(&ds);.. 
f6d0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65     } else if (ce
f6e0: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c  rt != NULL) {..l
f6f0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
f700: 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54  = 1;..if (SSL_CT
f710: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
f720: 65 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 6e 74  e_ASN1(ctx, (int
f730: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74  ) cert_len, cert
f740: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
f750: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f760: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
f770: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
f780: 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52  te: ",...GET_ERR
f790: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
f7a0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
f7b0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f7c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f7d0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
f7e0: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
f7f0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
f800: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
f810: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
f820: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
f830: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
f840: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
f850: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
f860: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
f870: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f880: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
f890: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72   use default cer
f8a0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
f8b0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
f8c0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f8d0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f8e0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f8f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f900: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23    return NULL;.#
f910: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a  endif..}.    }..
f920: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70      /* set our p
f930: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20  rivate key */.  
f940: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61    if (load_priva
f950: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b  te_key) {..if (k
f960: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26  eyfile == NULL &
f970: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  & key == NULL) {
f980: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20  ..    keyfile = 
f990: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69  certfile;..}...i
f9a0: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55  f (keyfile != NU
f9b0: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65  LL) {..    /* ge
f9c0: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65  t the private ke
f9d0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
f9e0: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61  h this certifica
f9f0: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b  te */..    if (k
fa00: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  eyfile == NULL) 
fa10: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65  {...keyfile = ce
fa20: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a  rtfile;..    }..
fa30: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
fa40: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
fa50: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65  file(ctx, F2N(ke
fa60: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  yfile, &ds), SSL
fa70: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
fa80: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  = 0) {...Tcl_DSt
fa90: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
faa0: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
fab0: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
fac0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
fad0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
fae0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
faf0: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
fb00: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
fb10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fb20: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
fb30: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69  et public key fi
fb40: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22  le ", keyfile, "
fb50: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52   ",...    GET_ER
fb60: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
fb70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
fb80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
fb90: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
fba0: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
fbb0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
fbc0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b  ;...} else if (k
fbd0: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey != NULL) {.. 
fbe0: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
fbf0: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53  se_PrivateKey_AS
fc00: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c  N1(EVP_PKEY_RSA,
fc10: 20 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29   ctx, key, (int)
fc20: 20 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20   key_len) <= 0) 
fc30: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  {.../* flush the
fc40: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
fc50: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
fc60: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
fc70: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
fc80: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
fc90: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
fca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fcb0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
fcc0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
fcd0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
fce0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
fcf0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
fd00: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
fd10: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
fd20: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
fd30: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
fd40: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
fd50: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
fd60: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
fd70: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
fd80: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
fd90: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
fda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fdb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
fdc0: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
fdd0: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
fde0: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
fdf0: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
fe00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
fe10: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
fe20: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
fe30: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
fe40: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75  .    /* Set to u
fe50: 73 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74  se default locat
fe60: 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72  ion and file for
fe70: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74   Certificate Aut
fe80: 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74  hority (CA) cert
fe90: 69 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20  ificates. The.  
fea0: 20 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68     * verify path
feb0: 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62   and store can b
fec0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
fed0: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52  the SSL_CERT_DIR
fee0: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65   env var. The ve
fef0: 72 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20  rify file can.  
ff00: 20 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64     * be overridd
ff10: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
ff20: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e  RT_FILE env var.
ff30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
ff40: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
ff50: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
ff60: 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a  x)) {..abort++;.
ff70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76      }..    /* Ov
ff80: 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20  errides for the 
ff90: 43 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61  CA verify path a
ffa0: 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b  nd file */.    {
ffb0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
ffc0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
ffd0: 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43  30000000L..if (C
ffe0: 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Apath != NULL ||
fff0: 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29   CAfile != NULL)
10000 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
10010 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63  ing ds1;..    Tc
10020 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
10030 73 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21  s1);...    if (!
10040 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
10050 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74  ify_locations(ct
10060 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
10070 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ds), F2N(CApath,
10080 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f   &ds1))) {...abo
10090 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
100a0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
100b0 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
100c0 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
100d0 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74  1);...    /* Set
100e0 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20   list of CAs to 
100f0 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77  send to client w
10100 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61  hen requesting a
10110 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63   client certific
10120 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68  ate */..    /* h
10130 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72  ttps://sourcefor
10140 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67  ge.net/p/tls/bug
10150 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a  s/57/ */..    /*
10160 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74   XXX:TODO: Let t
10170 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76  he user supply v
10180 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65  alues here inste
10190 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20  ad of something 
101a0 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74  that exists on t
101b0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  he filesystem */
101c0 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ..    STACK_OF(X
101d0 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
101e0 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
101f0 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
10200 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
10210 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e  ;..    if (certN
10220 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ames != NULL) {.
10230 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
10240 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
10250 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20  , certNames);.. 
10260 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
10270 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
10280 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43  .}..#else..if (C
10290 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b  Apath != NULL) {
102a0 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
102b0 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64  TX_load_verify_d
102c0 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61  ir(ctx, F2N(CApa
102d0 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61  th, &ds))) {...a
102e0 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  bort++;..    }..
102f0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
10300 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66  ree(&ds);..}..if
10310 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
10320 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53  ) {..    if (!SS
10330 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
10340 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
10350 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b  CAfile, &ds))) {
10360 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20  ...abort++;..   
10370 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
10380 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09  ingFree(&ds);...
10390 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20      /* Set list 
103a0 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74  of CAs to send t
103b0 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65  o client when re
103c0 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e  questing a clien
103d0 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  t certificate */
103e0 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ..    STACK_OF(X
103f0 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
10400 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
10410 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
10420 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
10430 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e  ;..    if (certN
10440 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ames != NULL) {.
10450 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
10460 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
10470 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20  , certNames);.. 
10480 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
10490 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
104a0 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  .}.#endif.    }.
104b0 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b  .    return ctx;
104c0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
104d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10510 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  . * StatusObjCmd
10520 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69   -- return certi
10530 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65  ficate for conne
10540 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a  cted peer.. *. *
10550 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
10560 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
10570 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
10580 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
10590 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
105e0 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
105f0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10600 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
10610 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10620 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
10630 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
10640 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
10650 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
10660 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
10670 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
10680 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10690 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
106a0 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
106b0 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
106c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
106d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
106e0 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
106f0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  int len;.    int
10700 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28   nid, res;.    (
10710 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
10720 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
10730 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
10740 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f  f (objc < 2 || o
10750 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63  bjc > 3 || (objc
10760 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70   == 3 && !strcmp
10770 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
10780 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c  bjv[1]), "-local
10790 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  "))) {..Tcl_Wron
107a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
107b0 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
107c0 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
107d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
107e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
107f0 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a  Get channel Id *
10800 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  /.    channelNam
10810 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10820 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20  g(objv[(objc == 
10830 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20  2 ? 1 : 2)]);.  
10840 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10850 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
10860 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
10870 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
10880 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
10890 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
108a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
108b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
108c0 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
108d0 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
108e0 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
108f0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
10900 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
10910 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
10920 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
10930 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
10940 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
10950 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10960 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
10970 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
10980 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
10990 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
109a0 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
109b0 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
109c0 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
109d0 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
109e0 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
109f0 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
10a00 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
10a10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10a20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
10a30 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
10a40 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
10a50 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
10a60 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
10a70 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
10a80 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
10a90 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10aa0 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
10ab0 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
10ac0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10ad0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
10ae0 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
10af0 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10b00 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
10b10 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
10b20 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
10b30 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
10b40 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
10b50 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
10b60 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28  rp, peer);..if (
10b70 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
10b80 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
10b90 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
10ba0 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
10bb0 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
10bc0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10bd0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
10be0 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
10bf0 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
10c00 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10c10 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53  r, "peername", S
10c20 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
10c30 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
10c40 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
10c50 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10c60 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53  jPtr, "sbits", S
10c70 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
10c80 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
10c90 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63  , NULL));..    c
10ca0 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
10cb0 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
10cc0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10cd0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10ce0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10cf0 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
10d00 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
10d10 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63  erify the X509 c
10d20 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65  ertificate prese
10d30 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72  nted by the peer
10d40 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10d50 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10d60 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c  tr, "verifyResul
10d70 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79  t",..X509_verify
10d80 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
10d90 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
10da0 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
10db0 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a  r->ssl)), -1);..
10dc0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
10dd0 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  de */.    mode =
10de0 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
10df0 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73  mode(statePtr->s
10e00 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64  sl);.    if (mod
10e10 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10e20 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44  NONE) {..LAPPEND
10e30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10e40 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
10e50 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
10e60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
10e70 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74  l_Obj *listObjPt
10e80 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
10e90 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  bj(0, NULL);..if
10ea0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10eb0 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20  RIFY_PEER) {..  
10ec0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10ed0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10ee0 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
10ef0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10f00 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d  "peer", -1));..}
10f10 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
10f20 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
10f30 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
10f40 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10f50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10f60 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10f70 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10f80 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20  Obj("fail if no 
10f90 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29  peer cert", -1))
10fa0 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
10fb0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  & SSL_VERIFY_CLI
10fc0 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20  ENT_ONCE) {..   
10fd0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10fe0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10ff0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
11000 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11010 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31  client once", -1
11020 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
11030 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
11040 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b  OST_HANDSHAKE) {
11050 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
11060 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11070 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
11080 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11090 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68  Obj("post handsh
110a0 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ake", -1));..}..
110b0 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
110c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
110d0 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62  ifyMode", listOb
110e0 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20  jPtr).    }..   
110f0 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
11100 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50  depth */.    LAP
11110 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11120 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
11130 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f  Depth", SSL_get_
11140 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61  verify_depth(sta
11150 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20  tePtr->ssl));.. 
11160 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
11170 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11180 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11190 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
111a0 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
111b0 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
111c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
111d0 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
111e0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
111f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
11200 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72  lpn", (char *)pr
11210 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
11220 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
11230 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11240 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
11250 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
11260 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
11270 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
11280 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41  alid for non-RSA
11290 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54   signature and T
112a0 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66  LS 1.3 */.    if
112b0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
112c0 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
112d0 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  er_signature_nid
112e0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
112f0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
11300 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
11310 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  et_signature_nid
11320 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11330 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
11340 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
11350 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
11360 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11370 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
11380 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20  HashAlgorithm", 
11390 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
113a0 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64   -1);..    /* Ad
113b0 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ded in OpenSSL 1
113c0 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45  .1.1a */.#if OPE
113d0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
113e0 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30  BER > 0x10101000
113f0 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  L.    if (objc =
11400 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
11410 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
11420 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
11430 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
11440 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
11450 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
11460 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
11470 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
11480 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
11490 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
114a0 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
114b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
114c0 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
114d0 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
114e0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23  2ln(nid), -1);.#
114f0 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53  endif..    Tcl_S
11500 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11510 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
11520 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11530 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
11580 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66   * ConnectionInf
11590 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  oObjCmd -- retur
115a0 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  n connection inf
115b0 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  o from OpenSSL..
115c0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
115d0 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e  *.A list of conn
115e0 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a  ection info.  *.
115f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
11600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11630 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
11640 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e  c int Connection
11650 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  InfoObjCmd(Clien
11660 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
11670 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
11680 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
11690 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
116a0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
116b0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
116c0 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
116d0 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20  o set a mode on 
116e0 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
116f0 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
11700 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
11710 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
11720 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
11730 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
11740 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
11750 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
11760 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
11770 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
11780 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
11790 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
117a0 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
117b0 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  entData;..    if
117c0 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
117d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
117e0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
117f0 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
11800 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
11820 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
11830 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
11840 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11850 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
11860 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
11870 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
11880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11890 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
118a0 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
118b0 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
118c0 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
118d0 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
118e0 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
118f0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
11900 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
11910 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
11920 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
11930 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11940 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
11950 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
11960 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
11970 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
11980 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
11990 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
119a0 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
119b0 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
119c0 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
119d0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
119e0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
119f0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
11a00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11a10 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
11a20 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
11a30 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
11a40 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
11a50 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
11a60 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
11a70 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
11a80 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
11a90 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
11aa0 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
11ab0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f  = NULL) {../* co
11ac0 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a  nnection state *
11ad0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11ae0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11af0 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74  state", SSL_stat
11b00 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
11b10 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  l), -1);.../* Ge
11b20 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20  t SNI requested 
11b30 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  server name */..
11b40 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11b50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72  rp, objPtr, "ser
11b60 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  vername", SSL_ge
11b70 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
11b80 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
11b90 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31  E_host_name), -1
11ba0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74  );.../* Get prot
11bb0 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  ocol */..LAPPEND
11bc0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11bd0 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  Ptr, "protocol",
11be0 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e   SSL_get_version
11bf0 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  (ssl), -1);.../*
11c00 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61   Renegotiation a
11c10 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45  llowed */..LAPPE
11c20 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11c30 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74  objPtr, "renegot
11c40 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c  iation_allowed",
11c50 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f   SSL_get_secure_
11c60 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75  renegotiation_su
11c70 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73  pport((SSL *) ss
11c80 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65  l));.../* Get se
11c90 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
11ca0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
11cb0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11cc0 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53  curity_level", S
11cd0 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
11ce0 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f  level(ssl));.../
11cf0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11d00 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11d10 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11d20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
11d30 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  , SSL_session_re
11d40 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  used(ssl));.../*
11d50 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
11d60 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11d70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d80 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53   "is_server", SS
11d90 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
11da0 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20  );.../* Is DTLS 
11db0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11dc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11dd0 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f   "is_dtls", SSL_
11de0 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20  is_dtls(ssl));. 
11df0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
11e00 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
11e10 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
11e20 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
11e30 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
11e40 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
11e50 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
11e60 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
11e70 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
11e80 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a  /* Cipher name *
11e90 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11ea0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11eb0 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50  cipher", SSL_CIP
11ec0 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
11ed0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11ee0 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
11ef0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
11f00 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11f10 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  r, "standard_nam
11f20 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73  e", SSL_CIPHER_s
11f30 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
11f40 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11f50 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20  OpenSSL name of 
11f60 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11f70 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11f80 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f  bjPtr, "openssl_
11f90 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63  name", OPENSSL_c
11fa0 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43  ipher_name(SSL_C
11fb0 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
11fc0 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31  ame(cipher)), -1
11fd0 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f  );.../* number o
11fe0 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73  f secret bits us
11ff0 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f  ed for cipher */
12000 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
12010 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
12020 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
12030 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12040 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
12050 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74  ecret_bits", bit
12060 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
12070 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12080 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73   "algorithm_bits
12090 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f  ", alg_bits);../
120a0 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63  * alg_bits is ac
120b0 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20  tual key secret 
120c0 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74  bits. If use bit
120d0 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c  s and secret (al
120e0 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69  gorithm) bits di
120f0 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65  ffer,..   the re
12100 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61  st of the bits a
12110 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66  re fixed, i.e. f
12120 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72  or limited expor
12130 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20  t ciphers (bits 
12140 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e  < 56) */.../* In
12150 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53  dicates which SS
12160 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76  L/TLS protocol v
12170 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66  ersion first def
12180 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20  ined the cipher 
12190 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
121a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
121b0 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53  "min_version", S
121c0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
121d0 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
121e0 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  1);.../* Cipher 
121f0 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  NID */..LAPPEND_
12200 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12210 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c  tr, "cipherNID",
12220 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
12230 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
12240 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69  et_cipher_nid(ci
12250 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
12260 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12270 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73  , objPtr, "diges
12280 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  tNID", (char *)O
12290 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
122a0 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f  PHER_get_digest_
122b0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
122c0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
122d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
122e0 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22  "keyExchangeNID"
122f0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12300 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12310 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65  get_kx_nid(ciphe
12320 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
12330 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
12340 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69  bjPtr, "authenti
12350 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61  cationNID", (cha
12360 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
12370 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75  SL_CIPHER_get_au
12380 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  th_nid(cipher)),
12390 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61   -1);.../* messa
123a0 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
123b0 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20  n code - Cipher 
123c0 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43  is AEAD (e.g. GC
123d0 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f  M or ChaCha20/Po
123e0 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a  ly1305) or not *
123f0 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61  /../* Authentica
12400 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77  ted Encryption w
12410 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64  ith associated d
12420 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b  ata (AEAD) check
12430 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
12440 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
12450 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61  , "cipher_is_aea
12460 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69  d", SSL_CIPHER_i
12470 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b  s_aead(cipher));
12480 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
12490 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
124a0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
124b0 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
124c0 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
124d0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
124e0 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
124f0 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
12500 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12510 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
12520 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
12530 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
12540 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
12550 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
12560 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
12570 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
12580 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12590 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69   "cipher_id", (i
125a0 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
125b0 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  et_id(cipher));.
125c0 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44  ../* Two-byte ID
125d0 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53   used in the TLS
125e0 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65   protocol of the
125f0 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f   given cipher */
12600 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12610 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
12620 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e  rotocol_id", (in
12630 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
12640 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69  t_protocol_id(ci
12650 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78  pher));.../* Tex
12660 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
12670 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
12680 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  /..if (SSL_CIPHE
12690 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69  R_description(ci
126a0 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f  pher, buf, sizeo
126b0 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
126c0 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
126d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
126e0 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e  tr, "description
126f0 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a  ", buf, -1);..}.
12700 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
12710 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
12720 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
12730 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
12740 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
12750 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
12760 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12770 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
12780 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
12790 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
127a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
127b0 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
127c0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
127d0 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c   char buffer[SSL
127e0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
127f0 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
12800 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
12810 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
12820 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
12830 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
12840 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
12850 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
12860 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
12870 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
12880 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12890 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
128a0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
128b0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
128c0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
128d0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
128e0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
128f0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
12900 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
12910 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
12920 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
12930 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
12940 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
12950 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12960 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
12970 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
12980 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12990 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
129a0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
129b0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
129c0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
129d0 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
129e0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
129f0 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
12a00 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12a10 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
12a20 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
12a30 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12a40 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12a50 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
12a60 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12a70 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
12a80 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
12a90 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
12aa0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
12ab0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12ac0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12ad0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
12ae0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
12af0 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
12b00 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
12b10 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
12b20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
12b30 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
12b40 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12b50 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
12b60 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
12b70 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12b80 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
12b90 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
12ba0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
12bb0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
12bc0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
12bd0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
12be0 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
12bf0 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
12c00 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
12c10 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
12c20 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
12c30 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
12c40 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12c50 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
12c60 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
12c70 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
12c80 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
12c90 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
12ca0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
12cb0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12cc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12cd0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
12ce0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
12cf0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
12d00 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
12d10 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
12d20 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12d30 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12d40 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
12d50 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
12d60 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
12d70 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
12d80 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
12d90 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20  app data */.#if 
12da0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12db0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
12dc0 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f  000L..SSL_SESSIO
12dd0 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
12de0 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49  pdata((SSL_SESSI
12df0 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26  ON *) session, &
12e00 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
12e10 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
12e20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12e30 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61  "ticket_app_data
12e40 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
12e50 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e  Size) len2);.#en
12e60 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  dif.../* Get mas
12e70 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
12e80 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12e90 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
12ea0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
12eb0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
12ec0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
12ed0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12ee0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
12ef0 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
12f00 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12f10 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
12f20 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
12f30 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
12f40 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
12f50 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
12f60 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12f70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12f80 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
12f90 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
12fa0 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
12fb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12fc0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
12fd0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
12fe0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
12ff0 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
13000 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
13010 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
13020 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
13030 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
13040 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
13050 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
13060 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
13070 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
13080 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13090 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
130a0 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
130b0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
130c0 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
130d0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
130e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
130f0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
13100 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
13110 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
13120 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
13130 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
13140 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13150 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
13160 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
13170 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13180 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
13190 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
131a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
131b0 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
131c0 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
131d0 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
131e0 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
131f0 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
13200 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
13210 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
13220 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
13230 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
13240 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
13250 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
13260 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
13270 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
13280 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
13290 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
132a0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
132b0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
132c0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
132d0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
132e0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
132f0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
13300 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
13310 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
13320 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
13330 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13340 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
13350 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
13360 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
13370 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
13380 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
13390 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
133a0 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
133b0 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
133c0 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
133d0 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
133e0 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
133f0 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
13400 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
13410 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
13420 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
13430 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
13440 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
13450 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
13460 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
13470 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
13480 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ];..for (int i =
13490 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f   0; i < sk_X509_
134a0 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
134b0 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
134c0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d  509_NAME *name =
134d0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61   sk_X509_NAME_va
134e0 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b  lue(ca_list, i);
134f0 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20  ..    if (name) 
13500 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e  {...X509_NAME_on
13510 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66  eline(name, buff
13520 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54  er, BUFSIZ);...T
13530 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13540 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
13550 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
13560 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
13570 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09  , -1));..    }..
13580 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50  }.    }.    LAPP
13590 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
135a0 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22  objPtr, "caList"
135b0 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20  , listPtr);.    
135c0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
135d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
135e0 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35  istCount", sk_X5
135f0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c  09_NAME_num(ca_l
13600 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ist));..    Tcl_
13610 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13620 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
13630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13640 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13690 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  . * VersionObjCm
136a0 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73  d -- return vers
136b0 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ion string from 
136c0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
136d0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
136e0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
136f0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
13700 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
13710 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13750 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
13760 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62  ic int.VersionOb
13770 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
13780 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
13790 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
137a0 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
137b0 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
137c0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
137d0 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69  objPtr;.    (voi
137e0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  d) clientData;. 
137f0 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a     (void) objc;.
13800 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b      (void) objv;
13810 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
13820 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62  alled");..    ob
13830 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
13840 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
13850 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
13860 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
13870 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
13880 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65  objPtr);..    re
13890 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
138a0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
138f0 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69  MiscObjCmd -- mi
13900 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  sc commands. *. 
13910 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
13920 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
13930 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
13940 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
13950 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
139a0 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62  tatic int.MiscOb
139b0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
139c0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
139d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
139e0 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
139f0 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
13a00 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
13a10 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e  nst char *comman
13a20 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c  ds [] = { "req",
13a30 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20   "strreq", NULL 
13a40 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d  };.    enum comm
13a50 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53  and { C_REQ, C_S
13a60 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  TRREQ, C_DUMMY }
13a70 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
13a80 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74  md;.    int isSt
13a90 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
13aa0 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28  er[16384];.    (
13ab0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
13ac0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
13ad0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
13ae0 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
13af0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13b00 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
13b10 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
13b20 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
13b30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13b40 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
13b50 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
13b60 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
13b70 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
13b80 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54  ", 0, &cmd) != T
13b90 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
13ba0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13bb0 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
13bc0 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
13bd0 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
13be0 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
13bf0 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
13c00 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
13c10 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
13c20 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
13c30 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
13c40 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
13c50 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
13c60 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
13c70 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
13c80 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
13c90 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b   Tcl_Size listc;
13ca0 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20  ..    int i;... 
13cb0 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
13cc0 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
13cd0 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
13ce0 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
13cf0 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
13d00 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
13d10 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
13d20 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
13d30 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
13d40 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
13d50 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13d60 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13d70 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13d80 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
13d90 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
13da0 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
13db0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
13dc0 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
13dd0 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
13de0 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
13df0 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
13e00 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13e10 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
13e20 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
13e30 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
13e40 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13e50 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
13e60 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
13e70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13e80 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
13e90 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13ea0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13eb0 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
13ec0 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
13ed0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
13ee0 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
13ef0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
13f00 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
13f10 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
13f20 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
13f30 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
13f40 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
13f50 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
13f60 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
13f70 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
13f80 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
13f90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
13fa0 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  , &listc, &listv
13fb0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13fc0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13fd0 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
13fe0 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
13ff0 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
14000 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
14010 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
14020 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
14030 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
14040 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
14050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14060 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
14070 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
14080 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
14090 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
140a0 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
140b0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
140c0 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
140d0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
140e0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
140f0 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
14100 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
14110 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
14120 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14130 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
14140 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
14150 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
14160 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
14170 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
14180 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
14190 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
141a0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
141b0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
141c0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
141d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
141e0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
141f0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14200 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
14210 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
14220 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
14230 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
14240 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
14250 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
14260 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
14270 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
14280 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
14290 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
142a0 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
142b0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
142c0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
142d0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
142e0 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
142f0 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
14300 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14310 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14320 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
14330 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
14340 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
14350 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
14360 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
14370 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
14380 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
14390 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
143a0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
143b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
143c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
143d0 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
143e0 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
143f0 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
14400 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
14410 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
14420 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
14430 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
14440 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
14450 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
14460 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
14470 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
14480 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
14490 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
144a0 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
144b0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
144c0 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
144d0 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
144e0 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
144f0 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
14500 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
14510 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
14520 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
14530 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
14540 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
14550 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
14560 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
14570 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
14580 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
14590 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
145a0 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
145b0 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
145c0 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
145d0 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
145e0 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
145f0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
14600 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
14610 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
14620 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
14630 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
14640 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
14650 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
14660 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
14670 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
14680 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
14690 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
146a0 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
146b0 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
146c0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
146d0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
146e0 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
146f0 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
14700 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
14710 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
14720 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
14730 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
14740 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
14750 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
14760 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
14770 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
14780 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
14790 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
147a0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
147b0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
147c0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
147d0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
147e0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
147f0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
14800 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
14810 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
14820 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
14830 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
14840 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14850 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
14860 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
14870 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
14880 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
14890 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
148a0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
148b0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
148c0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
148d0 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
148e0 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
148f0 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
14900 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
14910 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
14920 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
14930 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
14940 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
14950 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
14960 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
14970 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
14980 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
14990 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
149a0 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
149b0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
149c0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
149d0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
149e0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
149f0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
14a00 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
14a10 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58  _ERROR;...}....X
14a20 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28  509_set_version(
14a30 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f  cert,2);...ASN1_
14a40 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39  INTEGER_set(X509
14a50 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65  _get_serialNumbe
14a60 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b  r(cert),serial);
14a70 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
14a80 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
14a90 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
14aa0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
14ab0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
14ac0 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e  After(cert),(lon
14ad0 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29  g)60*60*24*days)
14ae0 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62  ;...X509_set_pub
14af0 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a  key(cert,pkey);.
14b00 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74  ...name=X509_get
14b10 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
14b20 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d  rt);....X509_NAM
14b30 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14b40 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53  xt(name,"C", MBS
14b50 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14b60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14b70 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_C, -1, -1, 
14b80 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14b90 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14ba0 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54  (name,"ST", MBST
14bb0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14bc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14bd0 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_ST, -1, -1, 
14be0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14bf0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14c00 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52  (name,"L", MBSTR
14c10 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14c20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14c30 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_L, -1, -1, 0)
14c40 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14c50 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14c60 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e  ame,"O", MBSTRIN
14c70 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14c80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14c90 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _O, -1, -1, 0);.
14ca0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14cb0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14cc0 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47  e,"OU", MBSTRING
14cd0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14ce0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14cf0 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  OU, -1, -1, 0);.
14d00 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14d10 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14d20 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47  e,"CN", MBSTRING
14d30 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14d40 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14d50 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  CN, -1, -1, 0);.
14d60 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14d70 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14d80 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52  e,"Email", MBSTR
14d90 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14da0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14db0 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31   k_Email, -1, -1
14dc0 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65  , 0);....X509_se
14dd0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
14de0 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66  ert,name);....if
14df0 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72   (!X509_sign(cer
14e00 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35  t,pkey,EVP_sha25
14e10 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35  6())) {...    X5
14e20 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
14e30 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
14e40 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
14e50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
14e60 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
14e70 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
14e80 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
14e90 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
14ea0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
14eb0 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63  signing certific
14ec0 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  ate",NULL);...  
14ed0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14ee0 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69  OR;...}....if (i
14ef0 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
14f00 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
14f10 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
14f20 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14f30 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14f40 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74    i=BIO_read(out
14f50 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62  ,buffer,sizeof(b
14f60 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20  uffer)-1);...   
14f70 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69   i=(i<0) ? 0 : i
14f80 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69  ;...    buffer[i
14f90 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63  ]='\0';...    Tc
14fa0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
14fb0 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29  pemout,buffer,0)
14fc0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73  ;...    BIO_flus
14fd0 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49  h(out);...    BI
14fe0 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d  O_free(out);...}
14ff0 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75   else {...    ou
15000 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
15010 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42  file());...    B
15020 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d  IO_write_filenam
15030 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09  e(out,pemout);..
15040 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
15050 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
15060 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
15070 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a  e_all(out);...}.
15080 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72  ...X509_free(cer
15090 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  t);...EVP_PKEY_f
150a0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
150b0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
150c0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
150d0 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e  00L...BN_free(bn
150e0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20  e);.#endif..    
150f0 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20  }..}..break;.   
15100 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b   default:..break
15110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15120 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
15130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15140 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20  ****/./* Init   
15150 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a            */./**
15160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15170 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
15180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
151c0 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a  . * Tls_Free --.
151d0 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
151e0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
151f0 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
15200 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
15210 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
15220 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
15230 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
15240 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  1. *. * Results:
15250 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
15260 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
15270 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
15280 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
152d0 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74  .void.Tls_Free(t
152e0 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c  ls_free_type *bl
152f0 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74  ockPtr) {.    St
15300 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
15310 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74  (State *)blockPt
15320 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
15330 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
15340 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50  Tls_Clean(stateP
15350 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  tr);.    ckfree(
15360 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
15370 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153b0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
153c0 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
153d0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
153e0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
153f0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
15400 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
15410 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
15420 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
15430 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
15440 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
15450 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
15460 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
15470 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
15480 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
15490 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
154a0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
154b0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
154c0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
154d0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
154e0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
15530 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id Tls_Clean(Sta
15540 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
15550 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
15560 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  led");..    /*. 
15570 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75      * we're assu
15580 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77  ming here that w
15590 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65  e're single-thre
155a0 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  aded.     */.   
155b0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
155c0 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
155d0 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
155e0 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
155f0 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
15600 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
15610 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
15620 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
15630 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
15640 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73  tos) {..ckfree(s
15650 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
15660 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
15670 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tos = NULL;.    
15680 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15690 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54  tr->bio) {../* T
156a0 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53  his will call SS
156b0 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20  L_shutdown. Bug 
156c0 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69  1414045 */..dpri
156d0 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c  ntf("BIO_free_al
156e0 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  l(%p)", statePtr
156f0 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65  ->bio);..BIO_fre
15700 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e  e_all(statePtr->
15710 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  bio);..statePtr-
15720 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >bio = NULL;.   
15730 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
15740 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72  Ptr->ssl) {..dpr
15750 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25  intf("SSL_free(%
15760 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
15770 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73  sl);..SSL_free(s
15780 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
15790 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
157a0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
157b0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74  if (statePtr->ct
157c0 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  x) {..SSL_CTX_fr
157d0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ee(statePtr->ctx
157e0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74  );..statePtr->ct
157f0 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  x = NULL;.    }.
15800 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
15810 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54  ->callback) {..T
15820 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
15830 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
15840 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ck);..statePtr->
15850 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b  callback = NULL;
15860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
15870 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
15880 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
15890 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
158a0 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61  >password);..sta
158b0 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
158c0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
158d0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
158e0 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  vcmd) {..Tcl_Dec
158f0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
15900 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74  tr->vcmd);..stat
15910 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c  ePtr->vcmd = NUL
15920 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  L;.    }..    dp
15930 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
15940 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ");.}.../*. *---
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15990 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20  ---. *. * Build 
159a0 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a  Info Command --.
159b0 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d   *. *.Create com
159c0 6d 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62  mand to return b
159d0 75 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61  uild info for pa
159e0 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  ckage.. *. * Res
159f0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
15a00 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20  ard Tcl result. 
15a10 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
15a20 73 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75  s:. *.Created bu
15a30 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  ild-info command
15a40 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15a90 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e  /..#ifndef STRIN
15aa0 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53  GIFY.#  define S
15ab0 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49  TRINGIFY(x) STRI
15ac0 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66  NGIFY1(x).#  def
15ad0 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78  ine STRINGIFY1(x
15ae0 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74  ) #x.#endif..int
15af0 0a 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e  .BuildInfoComman
15b00 64 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e  d(Tcl_Interp* in
15b10 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f  terp) {.    Tcl_
15b20 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  CmdInfo info;.. 
15b30 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f     if (Tcl_GetCo
15b40 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
15b50 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d  , "::tcl::build-
15b60 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b  info", &info)) {
15b70 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  ..Tcl_CreateObjC
15b80 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15b90 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66  ::tls::build-inf
15ba0 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63  o", info.objProc
15bb0 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41  , (void *)(...PA
15bc0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b  CKAGE_VERSION "+
15bd0 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f  " STRINGIFY(TLS_
15be0 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69  VERSION_UUID).#i
15bf0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e  f defined(__clan
15c00 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  g__) && defined(
15c10 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29  __clang_major__)
15c20 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d  ....    ".clang-
15c30 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c  " STRINGIFY(__cl
15c40 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66  ang_major__).#if
15c50 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f   __clang_minor__
15c60 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22   < 10....    "0"
15c70 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53  .#endif....    S
15c80 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
15c90 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66  _minor__).#endif
15ca0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63  .#if defined(__c
15cb0 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65  plusplus) && !de
15cc0 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a  fined(__OBJC__).
15cd0 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c  ...    ".cpluspl
15ce0 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  us".#endif.#ifnd
15cf0 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20  ef NDEBUG....   
15d00 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66   ".debug".#endif
15d10 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
15d20 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66  clang__) && !def
15d30 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  ined(__INTEL_COM
15d40 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65  PILER) && define
15d50 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20  d(__GNUC__).... 
15d60 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e     ".gcc-" STRIN
15d70 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23  GIFY(__GNUC__).#
15d80 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f  if __GNUC_MINOR_
15d90 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30  _ < 10....    "0
15da0 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20  ".#endif....    
15db0 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43  STRINGIFY(__GNUC
15dc0 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66  _MINOR__).#endif
15dd0 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f  .#ifdef __INTEL_
15de0 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20  COMPILER....    
15df0 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".icc-" STRINGIF
15e00 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  Y(__INTEL_COMPIL
15e10 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ER).#endif.#ifde
15e20 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a  f TCL_MEM_DEBUG.
15e30 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75  ...    ".memdebu
15e40 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  g".#endif.#if de
15e50 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a  fined(_MSC_VER).
15e60 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20  ...    ".msvc-" 
15e70 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56  STRINGIFY(_MSC_V
15e80 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ER).#endif.#ifde
15e90 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20  f USE_NMAKE.... 
15ea0 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64     ".nmake".#end
15eb0 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43  if.#ifndef TCL_C
15ec0 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09  FG_OPTIMIZED....
15ed0 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a      ".no-optimiz
15ee0 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e".#endif.#ifdef
15ef0 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20   __OBJC__....   
15f00 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a   ".objective-c".
15f10 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70  #if defined(__cp
15f20 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20  lusplus)....    
15f30 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69  "plusplus".#endi
15f40 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  f.#endif.#ifdef 
15f50 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44  TCL_CFG_PROFILED
15f60 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c  ....    ".profil
15f70 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e".#endif.#ifdef
15f80 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22   PURIFY....    "
15f90 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a  .purify".#endif.
15fa0 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55  #ifdef STATIC_BU
15fb0 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61  ILD....    ".sta
15fc0 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c  tic".#endif...),
15fd0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20   NULL);.    }.  
15fe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15ff0 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72  .}.../* Init scr
16000 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ipt */.static co
16010 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
16020 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
16030 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
16040 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  l.h".};../*. *--
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16090 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74  -. *. * Tls_Init
160a0 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69   --. *. *.This i
160b0 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74  s a package init
160c0 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
160d0 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63  dure, which is c
160e0 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20  alled. *.by Tcl 
160f0 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67  when this packag
16100 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64  e is to be added
16110 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74   to an interpret
16120 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
16130 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72  s:  Ssl configur
16140 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a  ed and loaded. *
16150 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
16160 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65  :. *. create the
16170 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e   ssl command, in
16180 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e  itialize ssl con
16190 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  text. *. *------
161a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
161e0 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52  /..#if TCL_MAJOR
161f0 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65  _VERSION > 8.#de
16200 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  fine MIN_VERSION
16210 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65   "9.0".#else.#de
16220 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  fine MIN_VERSION
16230 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44   "8.5".#endif..D
16240 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
16250 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
16260 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20   *interp) {..   
16270 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
16280 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f  ");..#ifdef USE_
16290 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66  TCL_STUBS.    if
162a0 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28   (Tcl_InitStubs(
162b0 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53  interp, MIN_VERS
162c0 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29  ION, 0) == NULL)
162d0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
162e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
162f0 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50  if.    if (Tcl_P
16300 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70  kgRequire(interp
16310 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52  , "Tcl", MIN_VER
16320 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c  SION, 0) == NULL
16330 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
16340 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
16350 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74    if (TlsLibInit
16360 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  (0) != TCL_OK) {
16370 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
16380 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
16390 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  d not initialize
163a0 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28   SSL library", (
163b0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
163c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
163d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
163e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
163f0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
16400 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68  ::ciphers", Ciph
16410 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ersObjCmd, (Clie
16420 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
16430 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
16440 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
16450 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
16460 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
16470 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c  ls::connection",
16480 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
16490 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
164a0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
164b0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
164c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
164d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
164e0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
164f0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
16500 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c  shakeObjCmd, (Cl
16510 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
16520 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
16530 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
16540 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
16550 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
16560 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49  :tls::import", I
16570 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
16580 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
16590 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
165a0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
165b0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
165c0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
165d0 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c  :tls::unimport",
165e0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c   UnimportObjCmd,
165f0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
16600 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
16610 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
16620 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
16630 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
16640 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63  , "::tls::unstac
16650 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  k", UnimportObjC
16660 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
16670 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
16680 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
16690 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
166a0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
166b0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61  erp, "::tls::sta
166c0 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43  tus", StatusObjC
166d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
166e0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
166f0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
16700 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
16710 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
16720 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72  erp, "::tls::ver
16730 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62  sion", VersionOb
16740 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
16750 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
16760 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
16770 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
16780 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
16790 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d  nterp, "::tls::m
167a0 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64  isc", MiscObjCmd
167b0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
167c0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
167d0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
167e0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
167f0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
16800 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f  p, "::tls::proto
16810 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73  cols", Protocols
16820 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
16830 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
16840 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
16850 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69   NULL);..    Bui
16860 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e  ldInfoCommand(in
16870 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28  terp);..    if (
16880 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76  interp && Tcl_Ev
16890 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63  al(interp, tlsTc
168a0 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20  lInitScript) != 
168b0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
168c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
168d0 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
168e0 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
168f0 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41  terp, PACKAGE_NA
16900 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ME, PACKAGE_VERS
16910 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ION);.}../*. *--
16920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16950 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f  ----*. *. *.Tls_
16960 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
16970 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169a0 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20  --*. *.Standard 
169b0 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
169c0 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a  ed by 'load'.. *
169d0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69  .Initializes thi
169e0 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20  s extension for 
169f0 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  a safe interpret
16a00 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  er.. *.---------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a30 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
16a40 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
16a50 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74  .As of 'Tls_Init
16a60 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  '. *. *.Result:.
16a70 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54   *..A standard T
16a80 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  cl error code.. 
16a90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
16ad0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
16ae0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  s_SafeInit(Tcl_I
16af0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
16b00 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
16b10 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  lled");.    retu
16b20 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65  rn Tls_Init(inte
16b30 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  rp);.}../*. *---
16b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
16b80 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16bc0 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
16bd0 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
16be0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
16bf0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
16c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c20 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
16c30 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
16c40 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
16c50 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
16c60 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
16c70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
16cb0 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
16cc0 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
16cd0 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
16ce0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
16cf0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
16d00 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
16d10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
16d20 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
16d30 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
16d40 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
16d50 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
16d60 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
16d70 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20  itialize) {..if 
16d80 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
16d90 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
16da0 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
16db0 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65  lize, but we are
16dc0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
16dd0 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e  ");...    return
16de0 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70   TCL_OK;..}...dp
16df0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
16e00 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
16e10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
16e20 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
16e30 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
16e40 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
16e50 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
16e60 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09  ..if (locks) {..
16e70 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
16e80 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55  ..    locks = NU
16e90 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f  LL;..    locksCo
16ea0 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64  unt = 0;..}.#end
16eb0 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  if..initialized 
16ec0 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
16ed0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
16ee0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
16ef0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
16f00 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
16f10 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
16f20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
16f30 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
16f40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70  itialized) {..dp
16f50 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62  rintf("Called, b
16f60 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20  ut using cached 
16f70 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e  value");..return
16f80 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a   status;.    }..
16f90 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
16fa0 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
16fb0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16fc0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16fd0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
16fe0 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
16ff0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
17000 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
17010 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
17020 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
17030 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
17040 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
17050 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
17060 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
17070 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
17080 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
17090 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
170a0 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
170b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
170c0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
170d0 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
170e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
170f0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
17100 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
17110 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
17120 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
17130 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
17140 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
17150 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
17160 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
17170 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
17180 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
17190 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
171a0 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
171b0 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
171c0 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
171d0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
171e0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
171f0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
17200 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
17210 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
17220 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  mx);.#endif..   
17230 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a   return status;.
17240 7d 0a                                            }.