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 0a 09  Tcl_Obj*)NULL)..
10f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20  return;..    if 
1100: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1110: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29  HANDSHAKE_START)
1120: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1130: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
1140: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d  = "start";.    }
1150: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
1160: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1170: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f  KE_DONE) {..majo
1180: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
1190: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22  ..minor = "done"
11a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
11b0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11c0: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72  CB_ALERT)..major
11d0: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73   = "alert";..els
11e0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
11f0: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61  L_ST_CONNECT).ma
1200: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b  jor = "connect";
1210: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1220: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54   & SSL_ST_ACCEPT
1230: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65  )..major = "acce
1240: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  pt";..else.....m
1250: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  ajor = "unknown"
1260: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20  ;...if (where & 
1270: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69  SSL_CB_READ)..mi
1280: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65  nor = "read";..e
1290: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
12a0: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d  SSL_CB_WRITE)..m
12b0: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a  inor = "write";.
12c0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12d0: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09  & SSL_CB_LOOP)..
12e0: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a  minor = "loop";.
12f0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1300: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09  & SSL_CB_EXIT)..
1310: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a  minor = "exit";.
1320: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20  .else.....minor 
1330: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
1340: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
1350: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
1360: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
1370: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d   major, minor, m
1380: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65  essage, and type
1390: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
13a0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
13b0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
13c0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
13d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13f0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1400: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22  StringObj("info"
1410: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1420: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1430: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1440: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1450: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
1460: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
1470: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
1480: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14c0: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a  bj(major, -1));.
14d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
14e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14f0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
1500: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69  _NewStringObj(mi
1510: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  nor, -1));..    
1520: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1530: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c  CB_ALERT) {..Tcl
1540: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1550: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1560: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1570: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1580: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e  alert_desc_strin
1590: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
15a0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
15b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
15c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
15d0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
15e0: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70  bj(SSL_alert_typ
15f0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65  e_string_long(re
1600: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20  t), -1));.    } 
1610: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  else {..Tcl_List
1620: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1630: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1640: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1650: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65  ingObj(SSL_state
1660: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
1670: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
1680: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1690: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
16a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
16b0: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29  Obj("info", -1))
16c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16d0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
16e0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
16f0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
1700: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
1710: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
1720: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
1730: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1740: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
1750: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a  -------------. *
17a0: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  . * MessageCallb
17b0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
17c0: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63  itors SSL protoc
17d0: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20  ol messages. *. 
17e0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
17f0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
1800: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
1810: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
1820: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20  --------------. 
1870: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
1880: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
1890: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73  static void.Mess
18a0: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20  ageCallback(int 
18b0: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72  write_p, int ver
18c0: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e  sion, int conten
18d0: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f  t_type, const vo
18e0: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  id *buf, size_t 
18f0: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76  len, SSL *ssl, v
1900: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
1910: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
1920: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
1930: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
1940: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
1950: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
1960: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
1970: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74     char *ver, *t
1980: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69  ype;.    BIO *bi
1990: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  o;.    char buff
19a0: 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62  er[15000];.    b
19b0: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20  uffer[0] = 0;.. 
19c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
19d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
19e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
19f0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
1a00: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
1a10: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f     switch(versio
1a20: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  n) {.#if OPENSSL
1a30: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1a40: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
1a50: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1a60: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
1a70: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
1a80: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45      case SSL2_VE
1a90: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1aa0: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv2";..break;.#
1ab0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
1ac0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
1ad0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1ae0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73  NO_SSL3).    cas
1af0: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL3_VERSION:.
1b00: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a  .ver = "SSLv3";.
1b10: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1b20: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52     case TLS1_VER
1b30: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1b40: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  Sv1";..break;.  
1b50: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45    case TLS1_1_VE
1b60: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b70: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.1";..break;
1b80: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32  .    case TLS1_2
1b90: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1ba0: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65   "TLSv1.2";..bre
1bb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1bc0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_3_VERSION:..ve
1bd0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09  r = "TLSv1.3";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bf0: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22  0:..ver = "none"
1c00: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;..break;.    de
1c10: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75  fault:..ver = "u
1c20: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b  nknown";..break;
1c30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
1c40: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65  ch (content_type
1c50: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ) {.    case SSL
1c60: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79  3_RT_HEADER:..ty
1c70: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09  pe = "Header";..
1c80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c90: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f  SSL3_RT_INNER_CO
1ca0: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70  NTENT_TYPE:..typ
1cb0: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65  e = "Inner Conte
1cc0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b  nt Type";..break
1cd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1ce0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52  RT_CHANGE_CIPHER
1cf0: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22  _SPEC:..type = "
1d00: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a  Change Cipher";.
1d10: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d20: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a   SSL3_RT_ALERT:.
1d30: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b  .type = "Alert";
1d40: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b  ndshake";..break
1d80: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d90: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44  RT_APPLICATION_D
1da0: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70  ATA:..type = "Ap
1db0: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b  p Data";..break;
1dc0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
1dd0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
1de0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61  30000000L.    ca
1df0: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52  se DTLS1_RT_HEAR
1e00: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22  TBEAT:..type = "
1e10: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65  Heartbeat";..bre
1e20: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
1e30: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20  efault:..type = 
1e40: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1e50: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63  ..    /* Needs c
1e60: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69  ompile time opti
1e70: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74  on "enable-ssl-t
1e80: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66  race". */.    if
1e90: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77   ((bio = BIO_new
1ea0: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21  (BIO_s_mem())) !
1eb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e  = NULL) {..int n
1ec0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69  ;..SSL_trace(wri
1ed0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63  te_p, version, c
1ee0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66  ontent_type, buf
1ef0: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69  , len, ssl, (voi
1f00: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42  d *)bio);..n = B
1f10: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
1f20: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  fer, BIO_pending
1f30: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20  (bio) < 15000 ? 
1f40: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1f50: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20   : 14999);..n = 
1f60: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1f70: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1f80: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1f90: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
1fa0: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
1fb0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
1fc0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
1fd0: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69  n, chan, directi
1fe0: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70  on, version, typ
1ff0: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61  e, and message a
2000: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2010: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2020: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2030: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
2040: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2050: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2060: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2070: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65  ringObj("message
2080: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2090: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
20b0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
20c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
20d0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
20e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
20f0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2100: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2110: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2120: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2130: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53  Obj(write_p ? "S
2140: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64  ent" : "Received
2150: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2160: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2170: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2180: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2190: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29  ingObj(ver, -1))
21a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
21b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
21c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
21d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
21e0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  type, -1));.    
21f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2200: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2210: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2220: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
2230: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
2240: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2250: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2260: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2270: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
2280: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2290: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
22a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
22b0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
22c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
22d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66  ----. *. * Verif
2320: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  yCallback --. *.
2330: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
2340: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
2350: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  dation process. 
2360: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  Used to control 
2370: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20  the. *.behavior 
2380: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52  when the SSL_VER
2390: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73  IFY_PEER flag is
23a0: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61   set. This is ca
23b0: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72  lled. *.whenever
23c0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69   a certificate i
23d0: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64  s inspected or d
23e0: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20  ecided invalid. 
23f0: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61  Called for. *.ea
2400: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69  ch certificate i
2410: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e  n the cert chain
2420: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a  .. *. * Checks:.
2430: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61   *.The certifica
2440: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63  te chain is chec
2450: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  ked starting wit
2460: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65  h the deepest ne
2470: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20  sting level. *. 
2480: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65   (the root CA ce
2490: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77  rtificate) and w
24a0: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20  orked upward to 
24b0: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69  the peer's certi
24c0: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73  ficate.. *.All s
24d0: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61  ignatures are va
24e0: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d  lid, current tim
24f0: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73  e is within firs
2500: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64  t and last valid
2510: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65  ity time.. *.Che
2520: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74  ck that the cert
2530: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65  ificate is issue
2540: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20  d by the issuer 
2550: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75  certificate issu
2560: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  er.. *.Check the
2570: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
2580: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74  us for each cert
2590: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63  ificate.. *.Chec
25a0: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f  k the validity o
25b0: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20  f the given CRL 
25c0: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76  and the cert rev
25d0: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a  ocation status..
25e0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c   *.Check the pol
25f0: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65  icies of all the
2600: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a   certificates. *
2610: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76  . * Args. *.prev
2620: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74  erify_ok indicat
2630: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63  es whether the c
2640: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66  ertificate verif
2650: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28  ication passed (
2660: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a  1) or not (0). *
2670: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
2680: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64  A callback bound
2690: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d   to the socket m
26a0: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ay return one of
26b0: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74  :. *.    0...- t
26c0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
26d0: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64  s deemed invalid
26e0: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74  , send verificat
26f0: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c  ion. *....  fail
2700: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65  ure alert to pee
2710: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65  r, and terminate
2720: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2730: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72     1...- the cer
2740: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
2750: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e  ed valid, contin
2760: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  ue with handshak
2770: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20  e.. *.    empty 
2780: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e  string.- no chan
2790: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74  ge to certificat
27a0: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a  e validation. *.
27b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
27c0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
27d0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
27e0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
27f0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
2800: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
2810: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2820: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2830: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
2890: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
28a0: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
28b0: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
28c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
28d0: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73  tr;.    SSL   *s
28e0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39  sl..= (SSL*)X509
28f0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
2900: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f  x_data(ctx, SSL_
2910: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39  get_ex_data_X509
2920: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29  _STORE_CTX_idx()
2930: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65  );.    X509  *ce
2940: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  rt..= X509_STORE
2950: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74  _CTX_get_current
2960: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20  _cert(ctx);.    
2970: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
2980: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
2990: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b  t_app_data(ssl);
29a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
29b0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
29c0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
29d0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30  int depth..= X50
29e0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
29f0: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29  error_depth(ctx)
2a00: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d  ;.    int err..=
2a10: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2a20: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a  get_error(ctx);.
2a30: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
2a40: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69  lled");.    dpri
2a50: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2a60: 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  ack: %d", ok);..
2a70: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2a80: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
2a90: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20  bj*)NULL) {../* 
2aa0: 55 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20  Use ok value if 
2ab0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20  verification is 
2ac0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20  required */..if 
2ad0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67  (statePtr->vflag
2ae0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  s & SSL_VERIFY_F
2af0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
2b00: 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ERT) {..    retu
2b10: 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b  rn ok;..} else {
2b20: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ..    return 1;.
2b30: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
2b40: 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c   (cert == NULL |
2b50: 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | ssl == NULL) {
2b60: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
2b70: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
2b80: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2b90: 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b  eval callback");
2ba0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2bb0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
2bc0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64  with fn, chan, d
2bd0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20  epth, cert info 
2be0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e  list, status, an
2bf0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a  d error args */.
2c00: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2c10: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2c20: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
2c30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2c40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2c50: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2c60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
2c70: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rify", -1));.   
2c80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2ca0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2cb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2cc0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2cd0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2ce0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2cf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d10: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2d20: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63  (depth));.    Tc
2d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2d50: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35  mdPtr, Tls_NewX5
2d60: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65  09Obj(interp, ce
2d70: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  rt));.    Tcl_Li
2d80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2da0: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2db0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  (ok));.    Tcl_L
2dc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2dd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2de0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2df0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30  ngObj((char*)X50
2e00: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
2e10: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
2e20: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50   -1));..    /* P
2e30: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65  revent I/O while
2e40: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20   callback is in 
2e50: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20  progress */.    
2e60: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e70: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41  gs |= TLS_TCL_CA
2e80: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20  LLBACK; */..    
2e90: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
2ea0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
2eb0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2ec0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b  (cmdPtr);.    ok
2ed0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
2ee0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2ef0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
2f00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2f10: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70  cmdPtr);..    dp
2f20: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c  rintf("VerifyCal
2f30: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72  lback: command r
2f40: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29  esult = %d", ok)
2f50: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  ;..    /* stateP
2f60: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54  tr->flags &= ~(T
2f70: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
2f80: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
2f90: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c  ok;./* By defaul
2fa0: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63  t, leave verific
2fb0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
2fc0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   */.}.../*. *---
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
3020: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
3030: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72  callback with er
3040: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
3050: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3060: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
3070: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
3080: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
3090: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
30a0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
30b0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
30c0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
30d0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
3130: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
3140: 65 50 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ePtr, const char
3150: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c   *msg) {.    Tcl
3160: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
3170: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
3180: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
3190: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74  *cmdPtr, *listPt
31a0: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  r;.    unsigned 
31b0: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74  long err;.    st
31c0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73  atePtr->err = ms
31d0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
31e0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
31f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
3200: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
3210: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
3220: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  n;..    /* Creat
3230: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
3240: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
3250: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67   and message arg
3260: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
3270: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
3280: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
3290: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
32a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
32b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
32c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
32d0: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d  ngObj("error", -
32e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
32f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3300: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3310: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
3320: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
3330: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
3340: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
3350: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d  ;.    if (msg !=
3360: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69   NULL) {..Tcl_Li
3370: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3380: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3390: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
33a0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a  Obj(msg, -1));..
33b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
33c0: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  msg = Tcl_GetStr
33d0: 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  ing(Tcl_GetObjRe
33e0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21  sult(interp))) !
33f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c  = NULL) {..Tcl_L
3400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3430: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a  gObj(msg, -1));.
3440: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c  .    } else {..l
3450: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
3460: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
3470: 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d  ;..while ((err =
3480: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29   ERR_get_error()
3490: 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) != 0) {..    T
34a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
34b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
34c0: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
34d0: 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65  StringObj(ERR_re
34e0: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
34f0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d  g(err), -1));..}
3500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
3510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3520: 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50  p, cmdPtr, listP
3530: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
3540: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3550: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3560: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3570: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
3580: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
3590: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
35a0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
35b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
35c0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c  . *. * KeyLogCal
3620: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57  lback --. *. *.W
3630: 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65  rite received ke
3640: 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69  y data to log fi
3650: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  le.. *. * Side e
3660: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
3670: 20 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
36c0: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  d KeyLogCallback
36d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
36e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e   const char *lin
36f0: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  e) {.    char *s
3700: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b  tr = getenv(SSLK
3710: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20  EYLOGFILE);.    
3720: 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64  FILE *fd;..    d
3730: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
3740: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20  ;..    if (str) 
3750: 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74  {..fd = fopen(st
3760: 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74  r, "a");..fprint
3770: 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e  f(fd, "%s\n",lin
3780: 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b  e);..fclose(fd);
3790: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f  ---. *. * Passwo
37f0: 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  rd Callback --. 
3800: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
3810: 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e   a password is n
3820: 65 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76  eeded for a priv
3830: 61 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61  ate key when loa
3840: 64 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69  ding. *.or stori
3850: 6e 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69  ng a PEM certifi
3860: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70  cate with encryp
3870: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c  tion. Evals call
3880: 62 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61  back. *.script a
3890: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72  nd returns the r
38a0: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73  esult as the pas
38b0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20  sword string in 
38c0: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  buf.. *. * Resul
38d0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
38e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
38f0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
3900: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
3910: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
3920: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69  .Password size i
3930: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f  n bytes or -1 fo
3940: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  r an error.. *. 
3950: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
39a0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
39b0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
39c0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77  int size, int rw
39d0: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74  flag, void *udat
39e0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
39f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
3a00: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
3a10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3a20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
3a30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
3a40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
3a50: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63  int code;.    Tc
3a60: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20  l_Size len;..   
3a70: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3a80: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ");..    /* If n
3a90: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20  o callback, use 
3aa0: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b  default callback
3ab0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
3ac0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
3ad0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54  = NULL) {..if (T
3ae0: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70  cl_EvalEx(interp
3af0: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64  , "tls::password
3b00: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
3b10: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f  GLOBAL) == TCL_O
3b20: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  K) {..    char *
3b30: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3b40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3b50: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c  sult(interp), &l
3b70: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
3b80: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  n > (Tcl_Size) s
3b90: 69 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d  ize-1) {...len =
3ba0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3bb0: 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  -1;..    }..    
3bc0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3bd0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
3be0: 0a 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d  ..    buf[len] =
3bf0: 20 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75   '\0';..    retu
3c00: 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d  rn (int) len;..}
3c10: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
3c20: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d  urn -1;..}.    }
3c30: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3c40: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
3c50: 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c  with fn, rwflag,
3c60: 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a   and size args *
3c70: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
3c80: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
3c90: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3ca0: 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  rd);.    Tcl_Lis
3cb0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3cc0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3cd0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3ce0: 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d  bj("password", -
3cf0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
3d00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3d10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3d20: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3d30: 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63  rwflag));.    Tc
3d40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3d50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3d60: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3d70: 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20  tObj(size));..  
3d80: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3d90: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3da0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
3db0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3dc0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3dd0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
3de0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
3df0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
3e00: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
3e10: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
3e20: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
3e30: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
3e40: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
3e50: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
3e60: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  {.#if (TCL_MAJOR
3e70: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
3e80: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
3e90: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
3ea0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
3eb0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
3ec0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
3ed0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
3ee0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
3ef0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
3f00: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3f10: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
3f20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
3f30: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
3f40: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
3f50: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77   pass back passw
3f60: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74  ord string and t
3f70: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c  runcate if too l
3f80: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ong */.    if (c
3f90: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
3fa0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3fb0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3fc0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3fd0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3fe0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
3ff0: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
4000: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20  e) size-1) {..  
4010: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a    len = (Tcl_Siz
4020: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73  e) size-1;..}..s
4030: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
4040: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
4050: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  .buf[len] = '\0'
4060: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28  ;..Tcl_Release((
4070: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
4080: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e  rp);..return (in
4090: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  t) len;.    }.  
40a0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
40b0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
40c0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  p);.    return -
40d0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  1;.}.../*. *----
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4120: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61   *. * Session Ca
4130: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
4140: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  ts --. *. *.Call
4150: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65  ed when a new se
4160: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ssion is added t
4170: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20  o the cache. In 
4180: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20  TLS 1.3. *.this 
4190: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20  may be received 
41a0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
41b0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  fter the handsha
41c0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69  ke. For. *.earli
41d0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69  er versions, thi
41e0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76  s will be receiv
41f0: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61  ed during the ha
4200: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73  ndshake.. *.This
4210: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65   is the preferre
4220: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20  d way to obtain 
4230: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73  a resumable sess
4240: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
4250: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4260: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4270: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4280: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
4290: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
42a0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20  s:. *.0 = error 
42b0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69  where session wi
42c0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  ll be immediatel
42d0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  y removed from t
42e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
42f0: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73  e.. *.1 = succes
4300: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61  s where app reta
4310: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73  ins session in s
4320: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e  ession cache, an
4330: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f  d must call SSL_
4340: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77  SESSION_free() w
4350: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  hen done.. *. *-
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
43b0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  t.SessionCallbac
43c0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f  k(SSL *ssl, SSL_
43d0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
43e0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
43f0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4400: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
4410: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
4420: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4430: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4440: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4450: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4460: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4470: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
4480: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
4490: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
44a0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74  n_id;.    size_t
44b0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67   len2;.    unsig
44c0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20  ned int ulen;.. 
44d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
44e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
44f0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4500: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
4510: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4520: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4530: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4540: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
4550: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4560: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4570: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4580: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
4590: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
45a0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65  , session id, se
45b0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e  ssion ticket, an
45c0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20  d lifetime args 
45d0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
45e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
45f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4600: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
4610: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4620: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4630: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4640: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
4650: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4660: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4670: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4680: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
4690: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
46a0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
46b0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
46c0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
46d0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
46e0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
46f0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
4700: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
4710: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4720: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4730: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4740: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4750: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
4760: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  ize) ulen));..  
4770: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
4780: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
4790: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
47a0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
47b0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
47c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
47d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
47e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
47f0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
4800: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
4810: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a   len2));..    /*
4820: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62   Lifetime - numb
4830: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f  er of seconds */
4840: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4850: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4860: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
4870: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c  cl_NewLongObj((l
4880: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ong) SSL_SESSION
4890: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
48a0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
48b0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  n)));..    /* Ev
48c0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
48d0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
48e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
48f0: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
4900: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
4910: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
4920: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
4930: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
4940: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20      /* Return 0 
4950: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65  for now until se
4960: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69  ssion handling i
4970: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
4980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
4990: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
49e0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
49f0: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
4a00: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
4a10: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4a20: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4a30: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4a40: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4a50: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4a60: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
4a70: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
4a80: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
4a90: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
4aa0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
4ab0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
4ac0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
4ad0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
4ae0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
4af0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4b00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4b10: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4b20: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4b30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4b40: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4b50: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4b60: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
4b70: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4b80: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4b90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4ba0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
4bb0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
4bc0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
4bd0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
4be0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
4bf0: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
4c00: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
4c10: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4c20: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4c30: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4c40: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4c50: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4c60: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
4c70: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
4c80: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
4c90: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
4ca0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
4cb0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4cc0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4d10: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4d20: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
4d30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4d40: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
4d50: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65  gned char *outle
4d60: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n,..const unsign
4d70: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73  ed char *in, uns
4d80: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c  igned int inlen,
4d90: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
4da0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4db0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
4dc0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4dd0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4de0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4df0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4e00: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
4e10: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
4e20: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4e30: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4e40: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
4e50: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4e60: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4e70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4e80: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
4e90: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
4ea0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
4eb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4ec0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  *) out, outlen, 
4ed0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4ee0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4ef0: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4f00: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4f10: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4f20: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4f30: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4f40: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4f50: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4f60: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
4f70: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
4f80: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
4f90: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
4fa0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
4fb0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4fc0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
4fe0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
4ff0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
5000: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
5010: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5020: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
5030: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
5040: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
5050: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
5060: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
5070: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
5080: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5090: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
50a0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
50b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
50c0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
50d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
50e0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
50f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5100: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5110: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
5120: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
5130: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
5140: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
5150: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
5160: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5170: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5180: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5190: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73  wStringObj((cons
51a0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20  t char *) *out, 
51b0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
51c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
51e0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
51f0: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f  nObj(res == SSL_
5200: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b  TLSEXT_ERR_OK));
5210: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5220: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5230: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5240: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5250: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5260: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5270: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5280: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
5290: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
52a0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
52b0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
52c0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
52d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
52e0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
52f0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5300: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
5310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
5320: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
5330: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
5340: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69  --. *. * Adverti
53a0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c  se Protocols Cal
53b0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50  lback for Next P
53c0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
53d0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72  ion (NPN) in Ser
53e0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20  verHello --. *. 
53f0: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.called when a 
5400: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73  TLS server needs
5410: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f   a list of suppo
5420: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66  rted protocols f
5430: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f  or Next. *.Proto
5440: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
5450: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5460: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
5470: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20  de effects:. *. 
5480: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
5490: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
54a0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  R_OK: NPN protoc
54b0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
54c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
54d0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
54e0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
54f0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  NPN protocol not
5500: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
5510: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5520: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5570: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
5580: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43  .static int.NPNC
5590: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
55a0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
55b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
55c0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  t, unsigned int 
55d0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  *outlen, void *a
55e0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
55f0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5600: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70  te*)arg;..    dp
5610: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
5620: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
5630: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5640: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5650: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5660: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5670: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c   /* Set protocol
5680: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66  s list */.    if
5690: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
56a0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a  os != NULL) {..*
56b0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  out = statePtr->
56c0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e  protos;..*outlen
56d0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
56e0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
56f0: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55  lse {..*out = NU
5700: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30  LL;..*outlen = 0
5710: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  ;..return SSL_TL
5720: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5730: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5740: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f  OK;.}.#endif.../
5760: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e  -------. *. * SN
57b0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  I Callback for S
57c0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
57d0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73  Perform server-s
57e0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  ide SNI hostname
57f0: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72   selection after
5800: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65   receiving SNI e
5810: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43  xtension. *.in C
5820: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c  lient Hello. Cal
5830: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20  led after hello 
5840: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66  callback but bef
5850: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63  ore ALPN callbac
5860: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
5870: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
5880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5890: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
58a0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
58b0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
58c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
58d0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  RR_OK: SNI hostn
58e0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e  ame is accepted.
58f0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5900: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5910: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5920: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f  RT_FATAL: SNI ho
5930: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5940: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
5950: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73  ection. *.    is
5960: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c   aborted. Defaul
5970: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53  t for alert is S
5980: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
5990: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f  ED_NAME.. *.SSL_
59a0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
59b0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f  _WARNING: 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 2c 20 77 61 72 6e 69 6e 67 20  cepted, warning 
59e0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e  alert. *.    sen
59f0: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  t (not supported
5a00: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68   in TLSv1.3). Th
5a10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5a20: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
5a30: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
5a40: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5a50: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e   not accepted an
5a60: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67  d not acknowledg
5a70: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20  ed,. *.    e.g. 
5a80: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62  if SNI has not b
5a90: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20  een configured. 
5aa0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5ab0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b00: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5b10: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f  t.SNICallback(co
5b20: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
5b30: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
5b40: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
5b50: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5b60: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
5b70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5b80: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
5b90: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
5ba0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
5bb0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
5bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
5bd0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  vername = NULL;.
5be0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5bf0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5c00: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5c10: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5c20: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5c30: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5c40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
5c50: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e  works for TLS 1.
5c60: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f  2 and earlier */
5c70: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
5c80: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  = SSL_get_server
5c90: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
5ca0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
5cb0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ame);.    if (!s
5cc0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72  ervername || ser
5cd0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c  vername[0] == '\
5ce0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  0') {..return SS
5cf0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5d00: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5d10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5d20: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5d30: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5d40: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5d50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d60: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
5d70: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
5d80: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72  chan, and server
5d90: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20   name args */.  
5da0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5db0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5dc0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5dd0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5de0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5df0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5e00: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5e10: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5e20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5e30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5e40: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5e50: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5e60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5e70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5e80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5e90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5ea0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5eb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5ec0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5ed0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5ee0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5ef0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5f00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5f10: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5f20: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5f30: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5f40: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5f50: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5f60: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5f70: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
5f80: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5f90: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5fa0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5fb0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5fc0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5fd0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5fe0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5ff0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6000: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
6010: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
6020: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6030: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
6040: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
6050: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
6060: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
6070: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6080: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6090: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
60a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
60f0: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
6100: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
6110: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
6120: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
6130: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
6140: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
6150: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
6160: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
6170: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
6180: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
6190: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
61a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
61b0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
61c0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
61d0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
61e0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
61f0: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
6200: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
6210: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
6220: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
6230: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
6240: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
6250: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
6260: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
6270: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
6280: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
6290: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
62a0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
62b0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
62c0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
62d0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
62e0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
62f0: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
6300: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
6310: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6320: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
6330: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
6340: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
6350: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
6360: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
6370: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6380: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
6390: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
63a0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
63b0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
63c0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
63d0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
63e0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
63f0: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
6400: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
6410: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
6420: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
6430: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
6440: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
64a0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53  HelloCallback(SS
64b0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
64c0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
64d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
64e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
64f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
6500: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
6510: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
6520: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
6530: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
6540: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6550: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6560: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6570: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6580: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
6590: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
65a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
65b0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
65c0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
65d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
65e0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
65f0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6600: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6610: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
6620: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
6630: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
6640: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6650: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6660: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6670: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6680: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
6690: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
66a0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
66b0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
66c0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
66d0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
66e0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
66f0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6700: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6710: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6720: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6730: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6740: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6750: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6760: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6770: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6780: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
6790: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
67a0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
67b0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
67c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
67d0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
67e0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
67f0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6800: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6810: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6820: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
6830: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6840: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6850: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6860: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6870: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6880: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
6890: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
68a0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
68b0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
68c0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
68d0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
68e0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
68f0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6900: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6910: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6920: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
6930: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6940: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6950: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6960: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6970: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6980: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
6990: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
69a0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
69b0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
69c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
69d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
69f0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6a00: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6a10: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6a20: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
6a30: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6a40: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6a50: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6a60: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6a70: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6a80: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6a90: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6aa0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6ab0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6ac0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6ad0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
6ae0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65  fn, chan, and se
6af0: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a  rver name args *
6b00: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
6b10: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
6b20: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
6b30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6b40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6b50: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
6b60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6b70: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  hello", -1));.  
6b80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6b90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6ba0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
6bb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6bc0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
6bd0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
6be0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
6bf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6c00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6c10: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6c20: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
6c30: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ame, (Tcl_Size) 
6c40: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  len));..    /* E
6c50: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
6c60: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
6c70: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
6c80: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
6c90: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
6ca0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
6cb0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
6cc0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6cd0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54  CLIENT_HELLO_RET
6ce0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  RY;..*alert = SS
6cf0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6d00: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a  USER_CANCELLED;.
6d10: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
6d20: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
6d30: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6d40: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20  LLO_SUCCESS;.   
6d50: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
6d60: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6d70: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74  O_ERROR;..*alert
6d80: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6d90: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6da0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
6db0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6dc0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6dd0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a  urn res;.}.../**
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6df0: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  **/./* Commands 
6e00: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
6e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e20: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6e70: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
6e80: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
6e90: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09  e ciphers. *. *.
6ea0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
6eb0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
6ec0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63  cess the "tls::c
6ed0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a  iphers" command.
6ee0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
6ef0: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61  able ciphers, ba
6f00: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f  sed upon protoco
6f10: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20  l selected.. *. 
6f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
6f30: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6f40: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
6f50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6f60: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20  .constructs and 
6f70: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e  destroys SSL con
6f80: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
6fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
6ff0: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
7000: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
7010: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
7020: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
7030: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
7040: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
7050: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
7060: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
7070: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
7080: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
7090: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61  TLS_NONE.};..sta
70a0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f  tic int.CiphersO
70b0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
70c0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
70d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
70e0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
70f0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7100: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
7110: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
7120: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7130: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
7140: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
7150: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
7160: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
7170: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
7180: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
7190: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
71a0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
71b0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
71c0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20  ETHOD *method;. 
71d0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
71e0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
71f0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
7200: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32     if ((objc < 2
7210: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
7220: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
7230: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
7240: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  objv, "protocol 
7250: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f  ?verbose? ?suppo
7260: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e  rted?");..return
7270: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7280: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
7290: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
72a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70  terp, objv[1], p
72b0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f  rotocols, "proto
72c0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  col", 0, &index)
72d0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
72e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
72f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
7300: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c  objc > 2) && Tcl
7310: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
7320: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7330: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d  2], &verbose) !=
7340: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7360: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7370: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65  c > 3) && Tcl_Ge
7380: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
7390: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
73a0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   &use_supported)
73b0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
73c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
73d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
73e0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
73f0: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
7400: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78  m protocol)index
7410: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  ) {..case TLS_SS
7420: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  L2:.#if OPENSSL_
7430: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
7440: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
7450: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
7460: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7470: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20  NSSL_NO_SSL2).. 
7480: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
74a0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
74b0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
74c0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
74d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
74e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
74f0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7500: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
7510: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7520: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
7530: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
7540: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
7550: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7560: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
7570: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
7580: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
7590: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
75a0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
75b0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
75c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
75d0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
75e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
75f0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7600: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53  .    method = SS
7610: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv3_method(); br
7620: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
7630: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
7640: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
7650: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7660: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7670: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7680: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
7690: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
76a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
76b0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
76c0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
76d0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
76e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
76f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7700: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
7710: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74  thod = TLSv1_met
7720: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7730: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7740: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_1:.#if defin
7750: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
7760: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7770: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  _NO_TLS1_1) || d
7780: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7790: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
77a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
77b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
77c0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
77d0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
77e0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
77f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7810: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7820: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f  ethod = TLSv1_1_
7830: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7840: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7850: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65  S_TLS1_2:.#if de
7860: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
7870: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7880: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
7890: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
78a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
78b0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
78c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
78d0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
78e0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
78f0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7900: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7910: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7920: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7930: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
7940: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
7950: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7960: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
7970: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7980: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
7990: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
79a0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
79b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
79c0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
79d0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
79e0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
79f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
7a00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7a10: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7a20: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74  method = TLS_met
7a30: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f  hod();..    SSL_
7a40: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
7a50: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
7a60: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7a70: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
7a80: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
7a90: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
7aa0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72  ERSION);..    br
7ab0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  eak;.#endif..def
7ac0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f  ault:..    metho
7ad0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29  d = TLS_method()
7ae0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
7af0: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53    }..    ctx = S
7b00: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
7b10: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20  d);.    if (ctx 
7b20: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7b30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7b40: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7b50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7b60: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7b70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7b80: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
7b90: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
7ba0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
7bb0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7bc0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52  t(interp, GET_ER
7bd0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
7be0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
7bf0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
7c00: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7c10: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7c20: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
7c30: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
7c40: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
7c50: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
7c60: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
7c70: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
7c80: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
7c90: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
7ca0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
7cb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
7cc0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
7cd0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
7ce0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
7cf0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
7d00: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f  rbose) {..    co
7d10: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20  nst char *cp;.. 
7d20: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7d30: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7d40: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7d50: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7d60: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7d70: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
7d80: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
7d90: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
7da0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
7db0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
7dc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
7dd0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7de0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7df0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7e00: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7e10: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7e20: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7e30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7e40: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7e50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
7e60: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b  har *) cp, -1));
7e70: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65  ..    }...} else
7e80: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
7e90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7ea0: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f  j("",0);..    fo
7eb0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
7ec0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
7ed0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
7ee0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
7ef0: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
7f00: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
7f10: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
7f20: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
7f30: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73  ../* textual des
7f40: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
7f50: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28  cipher */...if (
7f60: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
7f70: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73  iption(c, buf, s
7f80: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
7f90: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
7fa0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a  _AppendToObj(obj
7fb0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53  Ptr, buf, (Tcl_S
7fc0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29  ize) strlen(buf)
7fd0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
7fe0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7ff0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b  Obj(objPtr, "UNK
8000: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d  NOWN\n", 8);...}
8010: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
8020: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
8030: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50  ..    sk_SSL_CIP
8040: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d  HER_free(sk);..}
8050: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
8060: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
8070: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8080: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
8090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
80a0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
80b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
80c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72  -------. *. * Pr
8110: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d  otocolsObjCmd --
8120: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
8130: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09  protocols. *. *.
8140: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
8150: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
8160: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70  cess the "tls::p
8170: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e  rotocols" comman
8180: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
8190: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
81a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
81b0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
81c0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
81d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
81e0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
81f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
8240: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  int.ProtocolsObj
8250: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
8260: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8270: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8280: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
8290: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
82a0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
82b0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64  bjPtr;.    (void
82c0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
82d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
82e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
82f0: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
8300: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8310: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8320: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
8330: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
8340: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
8350: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72  r();..    objPtr
8360: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
8370: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66  j(0, NULL);..#if
8380: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
8390: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
83a0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
83b0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
83c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
83d0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
83e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
83f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8400: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8410: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8420: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b  TLS_SSL2], -1));
8430: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8440: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
8450: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8460: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
8470: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8480: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
8490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
84a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
84b0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
84c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
84d0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d  tocols[TLS_SSL3]
84e0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
84f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8500: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
8510: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8530: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
8540: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
8550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8560: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8570: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8580: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
8590: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23  S_TLS1], -1));.#
85a0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
85b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
85c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
85d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  L_NO_TLS1_1) && 
85e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
85f0: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
8600: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8610: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8620: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8630: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8640: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8650: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_1], -1));.#e
8660: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8670: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
8680: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8690: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  _NO_TLS1_2) && !
86a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
86b0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
86c0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
86d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
86e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
86f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8700: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
8710: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_2], -1));.#en
8720: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8730: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
8740: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8750: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54  NO_TLS1_3).    T
8760: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8770: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8780: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8790: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
87a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20  ls[TLS_TLS1_3], 
87b0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  -1));.#endif..  
87c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
87d0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
87e0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
87f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8840: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
8850: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
8860: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
8870: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
8880: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
8890: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
88a0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
88b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
88c0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
88d0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
88e0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
88f0: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
8900: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
8910: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
8920: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
8930: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
8940: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
89a0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
89b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
89c0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
89d0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
89e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
89f0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
8a00: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
8a10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8a20: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
8a30: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
8a40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
8a60: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
8a70: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
8a80: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
8a90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
8aa0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
8ab0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28  t err = 0;.    (
8ac0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
8ad0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8ae0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
8af0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8b00: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8b10: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8b20: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
8b30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8b40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
8b50: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
8b60: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
8b70: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8b80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
8b90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
8ba0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
8bb0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
8bc0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
8bd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8be0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
8bf0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
8c00: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
8c10: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
8c20: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
8c30: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
8c40: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
8c50: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
8c60: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
8c70: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
8c80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8c90: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
8ca0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
8cb0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
8cc0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
8cd0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
8ce0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
8cf0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
8d00: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53  p, "TLS", "HANDS
8d10: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22  HAKE", "CHANNEL"
8d20: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
8d30: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
8d40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8d50: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
8d60: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
8d70: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
8d80: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
8d90: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
8da0: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
8db0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20  rConnect");.    
8dc0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f  ret = Tls_WaitFo
8dd0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
8de0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20  r, &err, 1);.   
8df0: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
8e00: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
8e10: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29  urned: %i", ret)
8e20: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c  ;..    if (ret <
8e30: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72   0 && ((statePtr
8e40: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
8e50: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72  L_ASYNC) && (err
8e60: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a   == EAGAIN))) {.
8e70: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20  .dprintf("Async 
8e80: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41  set and err = EA
8e90: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30  GAIN");..ret = 0
8ea0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
8eb0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e  (ret < 0) {..lon
8ec0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74  g result;..errSt
8ed0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72  r = statePtr->er
8ee0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73  r;..Tcl_ResetRes
8ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63  ult(interp);..Tc
8f00: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
8f10: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c  ...if (!errStr |
8f20: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  | (*errStr == 0)
8f30: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20  ) {..    errStr 
8f40: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  = Tcl_PosixError
8f50: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54  (interp);..}...T
8f60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8f70: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61  interp, "handsha
8f80: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72  ke failed: ", er
8f90: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e  rStr, (char *) N
8fa0: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75  ULL);..if ((resu
8fb0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  lt = SSL_get_ver
8fc0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
8fd0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35  Ptr->ssl)) != X5
8fe0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20  09_V_OK) {..    
8ff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9000: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74  (interp, " due t
9010: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69  o \"", X509_veri
9020: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
9030: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c  ring(result), "\
9040: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
9050: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45  L);..}..Tcl_SetE
9060: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
9070: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
9080: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
9090: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
90a0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
90b0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
90c0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
90d0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
90e0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
90f0: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ROR;.    } else 
9100: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  {..if (err != 0)
9110: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
9120: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69  "Got an error wi
9130: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68  th a completed h
9140: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20  andshake: err = 
9150: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72  %i", err);..}..r
9160: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  et = 1;.    }.. 
9170: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
9180: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74  rning TCL_OK wit
9190: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20  h data \"%i\"", 
91a0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ret);.    Tcl_Se
91b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
91c0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
91d0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75  (ret));.    retu
91e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
91f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70  ------. *. * Imp
9240: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
9250: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
9260: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
9270: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c  process the "ssl
9280: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09  " command. *. *.
9290: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20  The ssl command 
92a0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20  pushes SSL over 
92b0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74  a (newly connect
92c0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20  ed) tcp socket. 
92d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
92e0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
92f0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
9300: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
9310: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
9320: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
9330: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
9390: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  .ImportObjCmd(Cl
93a0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
93b0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
93c0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
93d0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
93e0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
93f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
9400: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
9410: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
9420: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
9430: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
9440: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
9450: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
9460: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09     SSL_CTX *ctx.
9470: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9480: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20  _Obj *script..= 
9490: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
94a0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e  j *password..= N
94b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
94c0: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a   *vcmd..= NULL;.
94d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
94e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
94f0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
9500: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
9510: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9520: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
9530: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
9540: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53  t idx;.    Tcl_S
9550: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  ize len;.    int
9560: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54   flags...= TLS_T
9570: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
9580: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f   server...= 0;./
9590: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
95a0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
95b0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
95c0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55  r *keyfile..= NU
95d0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
95e0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  rtfile..= NULL;.
95f0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9600: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a  r *key..= NULL;.
9610: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
9620: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75  _len..= 0;.    u
9630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
9640: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rt..= NULL;.    
9650: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
9660: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  n..= 0;.    char
9670: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c   *ciphers..= NUL
9680: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
9690: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c  hersuites..= NUL
96a0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
96b0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
96c0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d   char *CApath..=
96d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
96e0: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c  *DHparams..= NUL
96f0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64  L;.    char *mod
9700: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  el...= NULL;.   
9710: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
9720: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f  e..= NULL;./* ho
9730: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65  stname for Serve
9740: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f  r Name Indicatio
9750: 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73  n */.    char *s
9760: 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c  ession_id..= NUL
9770: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9780: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  alpn..= NULL;.  
9790: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20    int ssl2 = 0, 
97a0: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ssl3 = 0;.    in
97b0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31  t tls1 = 1, tls1
97c0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d  _1 = 1, tls1_2 =
97d0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a   1, tls1_3 = 1;.
97e0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20      int proto = 
97f0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20  0, level = -1;. 
9800: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20     int verify = 
9810: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20  0, require = 0, 
9820: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73  request = 1, pos
9830: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b  t_handshake = 0;
9840: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
9850: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
9860: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
9870: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9880: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
9890: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
98a0: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a  ).    tls1 = 0;.
98b0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
98c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
98d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
98e0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
98f0: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64  tls1_1 = 0;.#end
9900: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
9910: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
9920: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9930: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31  TLS1_2).    tls1
9940: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _2 = 0;.#endif.#
9950: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9960: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
9970: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9980: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d  _3).    tls1_3 =
9990: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
99a0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
99b0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
99c0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
99d0: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74  v, "channel ?opt
99e0: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  ions?");..return
99f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9a00: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
9a10: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
9a20: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
9a30: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
9a40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
9a50: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
9a60: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
9a70: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
9a80: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
9a90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
9aa0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
9ab0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
9ac0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
9ad0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
9ae0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
9af0: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28  han);..    for (
9b00: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f  idx = 2; idx < o
9b10: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63  bjc; idx++) {..c
9b20: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47  har *opt = Tcl_G
9b30: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64  etString(objv[id
9b40: 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  x]);...if (opt[0
9b50: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
9b60: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22  reak;...OPTOBJ("
9b70: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09  -alpn", alpn);..
9b80: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c  OPTSTR("-cadir",
9b90: 20 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54   CApath);..OPTST
9ba0: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66  R("-cafile", CAf
9bb0: 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22  ile);..OPTBYTE("
9bc0: 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65  -cert", cert, ce
9bd0: 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52  rt_len);..OPTSTR
9be0: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65  ("-certfile", ce
9bf0: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  rtfile);..OPTSTR
9c00: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68  ("-cipher", ciph
9c10: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ers);..OPTSTR("-
9c20: 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72  ciphers", cipher
9c30: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  s);..OPTSTR("-ci
9c40: 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70  phersuites", cip
9c50: 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54  hersuites);..OPT
9c60: 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20  OBJ("-command", 
9c70: 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52  script);..OPTSTR
9c80: 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48  ("-dhparams", DH
9c90: 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54  params);..OPTBYT
9ca0: 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b  E("-key", key, k
9cb0: 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52  ey_len);..OPTSTR
9cc0: 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79  ("-keyfile", key
9cd0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
9ce0: 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b  -model", model);
9cf0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77  ..OPTOBJ("-passw
9d00: 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b  ord", password);
9d10: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74  ..OPTBOOL("-post
9d20: 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73  _handshake", pos
9d30: 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f  t_handshake);..O
9d40: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74  PTBOOL("-request
9d50: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50  ", request);..OP
9d60: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22  TBOOL("-require"
9d70: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54  , require);..OPT
9d80: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c  INT("-security_l
9d90: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09  evel", level);..
9da0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72  OPTBOOL("-server
9db0: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54  ", server);..OPT
9dc0: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65  STR("-servername
9dd0: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a  ", servername);.
9de0: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f  .OPTSTR("-sessio
9df0: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69  n_id", session_i
9e00: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  d);..OPTBOOL("-s
9e10: 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50  sl2", ssl2);..OP
9e20: 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73  TBOOL("-ssl3", s
9e30: 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl3);..OPTBOOL("
9e40: 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09  -tls1", tls1);..
9e50: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31  OPTBOOL("-tls1.1
9e60: 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54  ", tls1_1);..OPT
9e70: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20  BOOL("-tls1.2", 
9e80: 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f  tls1_2);..OPTBOO
9e90: 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73  L("-tls1.3", tls
9ea0: 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  1_3);..OPTOBJ("-
9eb0: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
9ec0: 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a  , vcmd);..OPTOBJ
9ed0: 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b  ("-vcmd", vcmd);
9ee0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f  ...OPTBAD("optio
9ef0: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64  n", "-alpn, -cad
9f00: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65  ir, -cafile, -ce
9f10: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d  rt, -certfile, -
9f20: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73  cipher, -ciphers
9f30: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c  uites, -command,
9f40: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79   -dhparams, -key
9f50: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64  , -keyfile, -mod
9f60: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d  el, -password, -
9f70: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20  post_handshake, 
9f80: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69  -request, -requi
9f90: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65  re, -security_le
9fa0: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73  vel, -server, -s
9fb0: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73  ervername, -sess
9fc0: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d  ion_id, -ssl2, -
9fd0: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c  ssl3, -tls1, -tl
9fe0: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d  s1.1, -tls1.2, -
9ff0: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69  tls1.3, or -vali
a000: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a  datecommand");..
a010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
a020: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
a030: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66  (request)..verif
a040: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
a050: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53  CLIENT_ONCE | SS
a060: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20  L_VERIFY_PEER;. 
a070: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
a080: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66  & require).verif
a090: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
a0a0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
a0b0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65  CERT;.    if (re
a0c0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
a0d0: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20  ndshake).verify 
a0e0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f  |= SSL_VERIFY_PO
a0f0: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20  ST_HANDSHAKE;.  
a100: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20    if (verify == 
a110: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c  0)..verify = SSL
a120: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20  _VERIFY_NONE;.. 
a130: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
a140: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  2 ? TLS_PROTO_SS
a150: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L2 : 0);.    pro
a160: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c  to |= (ssl3 ? TL
a170: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30  S_PROTO_SSL3 : 0
a180: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a190: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54  (tls1 ? TLS_PROT
a1a0: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20  O_TLS1 : 0);.   
a1b0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
a1c0: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  1 ? TLS_PROTO_TL
a1d0: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  S1_1 : 0);.    p
a1e0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20  roto |= (tls1_2 
a1f0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
a200: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _2 : 0);.    pro
a210: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20  to |= (tls1_3 ? 
a220: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
a230: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72   : 0);..    /* r
a240: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20  eset to NULL if 
a250: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f  blank string pro
a260: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20  vided */.    if 
a270: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29  (cert && !*cert)
a280: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20  ..        cert. 
a290: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a2a0: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a     if (key && !*
a2b0: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65  key)..        ke
a2c0: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  y.        = NULL
a2d0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69  ;.    if (certfi
a2e0: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65  le && !*certfile
a2f0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69  )         certfi
a300: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  le.= NULL;.    i
a310: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a  f (keyfile && !*
a320: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c  keyfile)..keyfil
a330: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
a340: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ;.    if (cipher
a350: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09  s && !*ciphers).
a360: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09          ciphers.
a370: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a380: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75      if (ciphersu
a390: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72  ites && !*cipher
a3a0: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75  suites) ciphersu
a3b0: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a  ites    = NULL;.
a3c0: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26      if (CAfile &
a3d0: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20  & !*CAfile).    
a3e0: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20      CAfile.     
a3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a400: 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43  f (CApath && !*C
a410: 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43  Apath).        C
a420: 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20  Apath.        = 
a430: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48  NULL;.    if (DH
a440: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61  params && !*DHpa
a450: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48  rams).        DH
a460: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20  params        = 
a470: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
a480: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
a490: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
a4a0: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  State *) ckalloc
a4b0: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65  ((unsigned) size
a4c0: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20  of(State));.    
a4d0: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c  memset(statePtr,
a4e0: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65   0, sizeof(State
a4f0: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  ));..    statePt
a500: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73  r->flags.= flags
a510: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a520: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b  interp.= interp;
a530: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
a540: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a  flags.= verify;.
a550: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
a560: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20  r.= "";..    /* 
a570: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20  allocate script 
a580: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70  */.    if (scrip
a590: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  t) {..(void) Tcl
a5a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a5b0: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b  j(script, &len);
a5c0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
a5d0: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c    statePtr->call
a5e0: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09  back = script;..
a5f0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a600: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
a610: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20  allback);..}.   
a620: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
a630: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a  ate password */.
a640: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64      if (password
a650: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
a660: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a670: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29  (password, &len)
a680: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
a690: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73     statePtr->pas
a6a0: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64  sword = password
a6b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
a6c0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a6d0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a  ->password);..}.
a6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
a6f0: 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20  locate validate 
a700: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69  command */.    i
a710: 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69  f (vcmd) {..(voi
a720: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a730: 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c  FromObj(vcmd, &l
a740: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
a750: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a760: 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20  vcmd = vcmd;..  
a770: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a780: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  nt(statePtr->vcm
a790: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
a7a0: 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e    if (model != N
a7b0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65  ULL) {..int mode
a7c0: 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d  ;../* Get the "m
a7d0: 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f  odel" context */
a7e0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
a7f0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
a800: 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09  model, &mode);..
a810: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
a820: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
a830: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
a840: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
a850: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a870: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  OR;..}.../*.. * 
a880: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
a890: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
a8a0: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f  ost channel.. */
a8b0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
a8c0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
a8d0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68  ;..if (Tcl_GetCh
a8e0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
a8f0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
a900: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  pe()) {..    Tcl
a910: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a920: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
a930: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
a940: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
a950: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
a960: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
a970: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a980: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a990: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a9a0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
a9b0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
a9c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a9d0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
a9e0: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
a9f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
aa00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aa10: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28  OR;..}..ctx = ((
aa20: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
aa30: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
aa40: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a  ta(chan))->ctx;.
aa50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
aa60: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69   ((ctx = CTX_Ini
aa70: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76  t(statePtr, serv
aa80: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69  er, proto, keyfi
aa90: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65  le, certfile, ke
aaa0: 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e  y, cert, key_len
aab0: 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c  ,..    cert_len,
aac0: 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c 65 2c   CApath, CAfile,
aad0: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
aae0: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44  suites, level, D
aaf0: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c  Hparams)) == NUL
ab00: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
ab10: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
ab20: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
ab30: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ab40: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
ab50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
ab60: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
ab70: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
ab80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ab90: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77  at the channel w
aba0: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28  orks in binary (
abb0: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65  for the.     * e
abc0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
abd0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
abe0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
abf0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
ac00: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
ac10: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
ac20: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
ac30: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
ac40: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
ac50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
ac60: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
ac70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ac80: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ac90: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
aca0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
acb0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
acc0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
acd0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
ace0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
acf0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ad00: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
ad10: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
ad20: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
ad30: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ad40: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ad50: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
ad60: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
ad70: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
ad80: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ad90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ada0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
adb0: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
adc0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
add0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ade0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
adf0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ae00: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
ae10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ae20: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ae30: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
ae40: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
ae50: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
ae60: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
ae70: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
ae80: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
ae90: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
aea0: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
aeb0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
aec0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
aed0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
aee0: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52  tatePtr,..(TCL_R
aef0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
af00: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
af10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
af20: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
af30: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
af40: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
af50: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
af60: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
af70: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
af80: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
af90: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
afa0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
afb0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
afc0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
afd0: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
afe0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
aff0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
b000: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
b010: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
b020: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c  anslation);..Tcl
b030: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b040: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b050: 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  ng);..Tcl_DStrin
b060: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b070: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63  nelEOFChar);..Tc
b080: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b090: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b0a0: 69 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ing);..return TC
b0b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
b0c0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b0d0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b0e0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b0f0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
b100: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b110: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
b120: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20  ranslation));.  
b130: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b140: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b150: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b160: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f  -encoding", Tcl_
b170: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b180: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b190: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ng));.    Tcl_Se
b1a0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b1b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b1c0: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72  >self, "-eofchar
b1d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
b1e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
b1f0: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20  lEOFChar));.    
b200: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b210: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b220: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62  tePtr->self, "-b
b230: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53  locking", Tcl_DS
b240: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
b250: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b260: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ));.    Tcl_DStr
b270: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b280: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b290: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b2a0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b2b0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
b2c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b2d0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b2e0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
b2f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b300: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b310: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ing);..    /*.  
b320: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c     * SSL Initial
b330: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a  ization.     */.
b340: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73      statePtr->ss
b350: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74  l = SSL_new(stat
b360: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
b370: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73  if (!statePtr->s
b380: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69  sl) {../* SSL li
b390: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09  brary error */..
b3a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b3b0: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e  (interp, "couldn
b3c0: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c  't construct ssl
b3d0: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54   session: ", GET
b3e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b3f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b400: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b410: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b420: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49  S", "IMPORT", "I
b430: 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  NIT", "FAILED", 
b440: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b450: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66  .Tls_Free((tls_f
b460: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b470: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
b480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b490: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74  .    /* Set host
b4a0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
b4b0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61      if (serverna
b4c0: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74  me) {../* Sets t
b4d0: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69  he server name i
b4e0: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20  ndication (SNI) 
b4f0: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65  in ClientHello e
b500: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20  xtension */../* 
b510: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f  Per RFC 6066, ho
b520: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49  stname is a ASCI
b530: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  I encoded string
b540: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36  , though RFC 436
b550: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f  6 says UTF-8. */
b560: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74  ..if (!SSL_set_t
b570: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28  lsext_host_name(
b580: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
b590: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65  ervername) && re
b5a0: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63  quire) {..    Tc
b5b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b5c0: 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20  nterp, "Set SNI 
b5d0: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64  extension failed
b5e0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b5f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b600: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b610: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b620: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b630: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41  ORT", "SNI", "FA
b640: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b650: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b660: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b670: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b680: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b690: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
b6a0: 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f   Set hostname fo
b6b0: 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61  r peer certifica
b6c0: 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69  te hostname veri
b6d0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65  fication in clie
b6e0: 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75  nts...   Don't u
b6f0: 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74  se SSL_set1_host
b700: 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69   since it has li
b710: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69  mitations. */..i
b720: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73  f (!SSL_add1_hos
b730: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  t(statePtr->ssl,
b740: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a   servername)) {.
b750: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
b770: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20  et DNS hostname 
b780: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b790: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b7a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b7b0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b7c0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b7d0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53  , "IMPORT", "HOS
b7e0: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22  TNAME", "FAILED"
b7f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b800: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
b810: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
b820: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b830: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b840: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b850: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73    /* Resume sess
b860: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66  ion id */.    if
b870: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20   (session_id && 
b880: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b890: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49  d) <= SSL_MAX_SI
b8a0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a  D_CTX_LENGTH) {.
b8b0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73  ./* SSL_set_sess
b8c0: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53  ion() */..if (!S
b8d0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f  SL_SESSION_set1_
b8e0: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67  id_context(SSL_g
b8f0: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65  et_session(state
b900: 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f  Ptr->ssl),...(co
b910: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
b920: 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c  r *) session_id,
b930: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
b940: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b950: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  d))) {..    Tcl_
b960: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b970: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73  erp, "Resume ses
b980: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20  sion failed: ", 
b990: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b9a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b9b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b9c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b9d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b9e0: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49   "SESSION", "FAI
b9f0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
ba00: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
ba10: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
ba20: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
ba30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
ba40: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
ba50: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20  ..    /* Enable 
ba60: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65  Application-Laye
ba70: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  r Protocol Negot
ba80: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73  iation. Examples
ba90: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a   are: http/1.0,.
baa0: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  .http/1.1, h2, h
bab0: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f  3, ftp, imap, po
bac0: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c  p3, xmpp-client,
bad0: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71   xmpp-server, mq
bae0: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f  tt, irc, etc. */
baf0: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b  .    if (alpn) {
bb00: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
bb10: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
bb20: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
bb30: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
bb40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bb50: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
bb60: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
bb70: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
bb80: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
bb90: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
bba0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
bbb0: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
bbc0: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26  (interp, alpn, &
bbd0: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54  cnt, &list) != T
bbe0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c  CL_OK) {..    Tl
bbf0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
bc00: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
bc10: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
bc20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
bc30: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
bc40: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
bc50: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f   for the protoco
bc60: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28  l-list */..for (
bc70: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20  i = 0; i < cnt; 
bc80: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  i++) {..    Tcl_
bc90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bca0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
bcb0: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20  ..    if (len > 
bcc0: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  255) {...Tcl_App
bcd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bce0: 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  , "ALPN protocol
bcf0: 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22   names too long"
bd00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bd10: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  ;...Tcl_SetError
bd20: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
bd30: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
bd40: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
bd50: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
bd60: 09 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f  ..Tls_Free((tls_
bd70: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
bd80: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
bd90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
bda0: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
bdb0: 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20  en += 1 + (int) 
bdc0: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69  len;..}.../* Bui
bdd0: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ld the complete 
bde0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
bdf0: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c  ..protos = ckall
be00: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a  oc(protos_len);.
be10: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ./* protocol-lis
be20: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d  ts consist of 8-
be30: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69  bit length-prefi
be40: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67  xed, byte string
be50: 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30  s */..for (j = 0
be60: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20  , p = protos; j 
be70: 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20  < cnt; j++) {.. 
be80: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54     char *str = T
be90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
bea0: 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65  Obj(list[j], &le
beb0: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20  n);..    *p++ = 
bec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20  (unsigned char) 
bed0: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79  len;..    memcpy
bee0: 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74  (p, str, (size_t
bef0: 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b  ) len);..    p +
bf00: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  = len;..}.../* S
bf10: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
bf20: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20  os makes a copy 
bf30: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d  of the protocol-
bf40: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65  list */../* Note
bf50: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
bf60: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74  reverses the ret
bf70: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e  urn value conven
bf80: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c  tion */..if (SSL
bf90: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
bfa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bfb0: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c  protos, protos_l
bfc0: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  en)) {..    Tcl_
bfd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bfe0: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70  erp, "Set ALPN p
bff0: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a  rotocols failed:
c000: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
c010: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
c020: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
c030: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
c040: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
c050: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
c060: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
c070: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
c080: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
c090: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
c0a0: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
c0b0: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
c0c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
c0d0: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
c0e0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
c0f0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c100: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
c110: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c120: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
c130: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
c140: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
c150: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
c160: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
c170: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
c180: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
c190: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
c1a0: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
c1b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c1c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c1d0: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
c1e0: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c  to us */.    SSL
c1f0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
c200: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
c210: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
c220: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  k);.    SSL_set_
c230: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
c240: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66  atePtr->ssl, Inf
c250: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20  oCallback);..   
c260: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72   /* Callback for
c270: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f   observing proto
c280: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  col messages */.
c290: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
c2a0: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20  NO_SSL_TRACE.   
c2b0: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58   /* void SSL_CTX
c2c0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c2d0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c2e0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c2f0: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64  tePtr);.    void
c300: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
c310: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c320: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65  tr->ctx, Message
c330: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20  Callback); */.  
c340: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
c350: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
c360: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
c370: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
c380: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c390: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c3a0: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ssl, MessageCall
c3b0: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  back);.#endif.. 
c3c0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
c3d0: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
c3e0: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
c3f0: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
c400: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
c410: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
c420: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
c430: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
c440: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
c450: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
c460: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61  /* Server callba
c470: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  cks */..SSL_CTX_
c480: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c490: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50  rname_arg(stateP
c4a0: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a  tr->ctx, (void *
c4b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
c4c0: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
c4d0: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62  servername_callb
c4e0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
c4f0: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b  x, SNICallback);
c500: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
c510: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74  ient_hello_cb(st
c520: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c  atePtr->ctx, Hel
c530: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  loCallback, (voi
c540: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c550: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c560: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  otos != NULL) {.
c570: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c580: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28  _alpn_select_cb(
c590: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
c5a0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
c5b0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c5c0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c5d0: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d      if (tls1_2 =
c5e0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c5f0: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f   0) {...SSL_CTX_
c600: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f  set_next_protos_
c610: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74  advertised_cb(st
c620: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e  atePtr->ctx, NPN
c630: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
c640: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
c650: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09    }.#endif..}...
c660: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72  /* Enable server
c670: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65   to send cert re
c680: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64  quest after hand
c690: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f  shake (TLS 1.3 o
c6a0: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72  nly) */../* A wr
c6b0: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75  ite operation mu
c6c0: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f  st take place fo
c6d0: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74  r the Certificat
c6e0: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a  e Request to be.
c6f0: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20  .   sent to the 
c700: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e  client, this can
c710: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53   be done with SS
c720: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29  L_do_handshake()
c730: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
c740: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
c750: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b  ake && tls1_3) {
c760: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79  ..    SSL_verify
c770: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e  _client_post_han
c780: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d  dshake(statePtr-
c790: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73  >ssl);..}.../* s
c7a0: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72  et automatic cur
c7b0: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a  ve selection */.
c7c0: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75  .SSL_set_ecdh_au
c7d0: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  to(statePtr->ssl
c7e0: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73  , 1);.../* Set s
c7f0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
c800: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
c810: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
c820: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
c830: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c840: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
c850: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
c860: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
c870: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
c880: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c890: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
c8a0: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c8b0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
c8c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c8d0: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
c8e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c8f0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c900: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c910: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
c920: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
c930: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
c940: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
c950: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
c960: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
c970: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
c980: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
c990: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
c9a0: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
c9b0: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
c9c0: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
c9d0: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
c9e0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
c9f0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
ca00: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
ca10: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
ca20: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
ca30: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
ca40: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
ca50: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
ca60: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
ca70: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
ca80: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
ca90: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
caa0: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
cab0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
cac0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73  .    }.    SSL_s
cad0: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d  et_bio(statePtr-
cae0: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e  >ssl, statePtr->
caf0: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  p_bio, statePtr-
cb00: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f  >p_bio);.    BIO
cb10: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74  _set_ssl(statePt
cb20: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72  r->bio, statePtr
cb30: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  ->ssl, BIO_NOCLO
cb40: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  SE);..    /*.   
cb50: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49    * End of SSL I
cb60: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nit.     */.    
cb70: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
cb80: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ng %s", Tcl_GetC
cb90: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
cba0: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
cbb0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
cbc0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20  nterp, (char *) 
cbd0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cbe0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
cbf0: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
cc00: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
cc10: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f  ---. *. * Unimpo
cc70: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
cc80: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
cc90: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
cca0: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73  emove the topmos
ccb0: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72  t channel filter
ccc0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
ccd0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
cce0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
ccf0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
cd00: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
cd10: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
cd20: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
cd30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
cd80: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  int.UnimportObjC
cd90: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
cda0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
cdb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
cdc0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
cdd0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
cde0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
cdf0: 20 63 68 61 6e 2c 20 63 68 69 6c 64 3b 09 2f 2a   chan, child;./*
ce00: 20 54 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64   The stacked and
ce10: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
ce20: 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nels */.    Tcl_
ce30: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61  DString upperCha
ce40: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c  nnelTranslation,
ce50: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f   upperChannelBlo
ce60: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  cking, upperChan
ce70: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70  nelEncoding, upp
ce80: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ce90: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  ;.    int res = 
cea0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69  TCL_OK;.    (voi
ceb0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
cec0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
ced0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
cee0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
cef0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cf00: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
cf10: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
cf20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cf30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c     }..    /* Val
cf40: 69 64 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61  idate channel na
cf50: 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  me */.    chan =
cf60: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
cf70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
cf80: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
cf90: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
cfa0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
cfb0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
cfc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cfd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
cfe0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
cff0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
d000: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
d010: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
d020: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
d030: 0a 20 20 20 20 63 68 69 6c 64 20 3d 20 54 63 6c  .    child = Tcl
d040: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
d050: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  el(chan);..    /
d060: 2a 20 56 65 72 69 66 79 20 69 73 20 61 20 73 74  * Verify is a st
d070: 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f  acked channel */
d080: 0a 20 20 20 20 69 66 20 28 63 68 69 6c 64 20 3d  .    if (child =
d090: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
d0a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d0b0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
d0c0: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
d0d0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
d0e0: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 73 74 61  .."\": not a sta
d0f0: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 2c 20 28  cked channel", (
d100: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d110: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
d120: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
d130: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20  S", "UNIMPORT", 
d140: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
d150: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
d160: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
d170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
d180: 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e 79      /* Flush any
d190: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
d1a0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46 6c 75  .    if (Tcl_Flu
d1b0: 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f  sh(chan) != TCL_
d1c0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
d1d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
d1e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
d1f0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
d200: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
d210: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
d220: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
d230: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
d240: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d250: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
d260: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  har);.    Tcl_DS
d270: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
d280: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d290: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 75  ;..    /* Get cu
d2a0: 72 72 65 6e 74 20 63 6f 6e 66 69 67 20 2d 20 45  rrent config - E
d2b0: 4f 4c 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  OL translation, 
d2c0: 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20 62 75 66  encoding and buf
d2d0: 66 65 72 69 6e 67 20 6f 70 74 69 6f 6e 73 20 61  fering options a
d2e0: 72 65 20 73 68 61 72 65 64 20 62 65 74 77 65 65  re shared betwee
d2f0: 6e 20 61 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 69  n all channels i
d300: 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20  n the stack */. 
d310: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
d320: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d330: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
d340: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d350: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
d360: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
d370: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
d380: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
d390: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
d3a0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
d3b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d3c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d3d0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
d3e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d3f0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
d400: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d410: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
d420: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
d430: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
d440: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61  );..    /* Unsta
d450: 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61  ck the channel a
d460: 6e 64 20 72 65 73 74 6f 72 65 20 75 6e 64 65 72  nd restore under
d470: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 63 6f  lying channel co
d480: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 69 66 20 28  nfig */.    if (
d490: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e  Tcl_UnstackChann
d4a0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
d4b0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   == TCL_OK) {..T
d4c0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
d4d0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c  ion(interp, chil
d4e0: 64 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  d, "-encoding", 
d4f0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
d500: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
d510: 63 6f 64 69 6e 67 29 29 3b 0a 09 54 63 6c 5f 53  coding));..Tcl_S
d520: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d530: 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22  interp, child, "
d540: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
d550: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
d560: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
d570: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e  ));..Tcl_SetChan
d580: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d590: 2c 20 63 68 69 6c 64 2c 20 22 2d 74 72 61 6e 73  , child, "-trans
d5a0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
d5b0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d5c0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d5d0: 6f 6e 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68  on));..Tcl_SetCh
d5e0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d5f0: 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 62 6c 6f  rp, child, "-blo
d600: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  cking", Tcl_DStr
d610: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
d620: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29  hannelBlocking))
d630: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
d640: 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  res = TCL_ERROR;
d650: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
d660: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54  lean-up */.    T
d670: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d680: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
d690: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
d6a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
d6b0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
d6c0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
d6d0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d6e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d6f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d700: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d710: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
d720: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
d730: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
d780: 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73  CTX_Init -- cons
d790: 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20  truct a SSL_CTX 
d7a0: 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52  instance. *. * R
d7b0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c  esults:. *.A val
d7c0: 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61  id SSL_CTX insta
d7d0: 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a  nce or NULL.. *.
d7e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
d7f0: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53  . *.constructs S
d800: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
d810: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
d860: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43  atic SSL_CTX *.C
d870: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
d880: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
d890: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
d8a0: 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c  , char *keyfile,
d8b0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c   char *certfile,
d8c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
d8d0: 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65  ar *key, unsigne
d8e0: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63  d char *cert, Tc
d8f0: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20  l_Size key_len, 
d900: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
d910: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
d920: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
d930: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
d940: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
d950: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
d960: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
d970: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
d980: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
d990: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
d9a0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
d9b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
d9c0: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69  String ds;.    i
d9d0: 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72  nt off = 0, abor
d9e0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  t = 0;.    int l
d9f0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b  oad_private_key;
da00: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
da10: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
da20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
da30: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
da40: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41  !proto) {..Tcl_A
da50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
da60: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72  rp, "no valid pr
da70: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22  otocol selected"
da80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
da90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
daa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
dab0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
dac0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
dad0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
dae0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
daf0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
db00: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
db10: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
db20: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
db30: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
db40: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
db50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
db60: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
db70: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
db80: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
db90: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
dba0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
dbb0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
dbc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
dbd0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
dbe0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
dbf0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
dc00: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
dc10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dc20: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
dc30: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
dc40: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dc50: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
dc60: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
dc70: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
dc80: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
dc90: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
dca0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dcb0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dcc0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
dcd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dce0: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f  "TLS 1.0 protoco
dcf0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
dd00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
dd10: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
dd20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
dd30: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
dd40: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
dd50: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
dd60: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
dd70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dd80: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
dd90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dda0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
ddb0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
ddc0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
ddd0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
dde0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
ddf0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
de00: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
de10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
de20: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
de30: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
de40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
de50: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
de60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
de70: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
de80: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
de90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
dea0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
deb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
dec0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
ded0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
dee0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
def0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
df00: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
df10: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
df20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
df30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
df40: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
df50: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
df60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
df70: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
df80: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f  ndif.    if (pro
df90: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55  to == 0) {../* U
dfa0: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f  se full range */
dfb0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
dfc0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
dfd0: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54  ctx, 0);..SSL_CT
dfe0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
dff0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
e000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
e010: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
e020: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
e030: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
e040: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
e050: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
e060: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e070: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
e080: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
e090: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e0a0: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
e0b0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
e0c0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
e0d0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e0e0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e0f0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
e100: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e110: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
e120: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
e130: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
e140: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
e150: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
e160: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
e170: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
e180: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
e190: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
e1a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e1b0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
e1c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e1d0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
e1e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e1f0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
e200: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
e210: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
e220: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
e230: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
e240: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
e250: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
e260: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
e270: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
e280: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e290: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
e2a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e2b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
e2c0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
e2d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
e2e0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e2f0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
e300: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
e310: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
e320: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
e330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
e350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
e370: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e380: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
e390: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
e3a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
e3b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e3c0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
e3d0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e3e0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
e3f0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
e400: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e410: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
e420: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e430: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
e440: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
e450: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
e460: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
e470: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
e480: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
e490: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
e4a0: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
e4b0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
e4c0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
e4d0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
e4e0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e4f0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
e500: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
e510: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
e520: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
e530: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
e540: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
e550: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e560: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
e570: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
e580: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e590: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
e5a0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
e5b0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
e5c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
e5d0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
e5e0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e5f0: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
e600: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
e610: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e620: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
e630: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e640: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
e650: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
e660: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
e670: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
e680: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
e690: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e6a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
e6b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e6c0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
e6d0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e6e0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
e6f0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
e700: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
e710: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e720: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
e730: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e740: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
e750: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e760: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
e770: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e780: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
e790: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e7a0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e7b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e7c0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
e7d0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e7e0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
e7f0: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
e800: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
e810: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e820: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
e830: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e840: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
e850: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
e860: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e870: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
e880: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
e890: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
e8a0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
e8b0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
e8c0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
e8d0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
e8e0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
e8f0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e900: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76  ..    if (getenv
e910: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29  (SSLKEYLOGFILE))
e920: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
e930: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28  keylog_callback(
e940: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  ctx, KeyLogCallb
e950: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ack);.    }..#if
e960: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e970: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
e980: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e990: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74  _3).    if (prot
e9a0: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  o == TLS_PROTO_T
e9b0: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54  LS1_3) {..SSL_CT
e9c0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
e9d0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
e9e0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53  1_3_VERSION);..S
e9f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
ea00: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
ea10: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
ea20: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
ea30: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69  .    /* Force ci
ea40: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f  pher selection o
ea50: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a  rder by server *
ea60: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72  /.    if (!isSer
ea70: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ver) {..SSL_CTX_
ea80: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ea90: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53   SSL_OP_CIPHER_S
eaa0: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45  ERVER_PREFERENCE
eab0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  );.    }..#if OP
eac0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
ead0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
eae0: 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61  0L.    OpenSSL_a
eaf0: 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d  dd_all_algorithm
eb00: 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70  s(); /* Load cip
eb10: 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73  hers and digests
eb20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   */.#endif..    
eb30: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
eb40: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
eb50: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
eb60: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
eb70: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
eb80: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
eb90: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
eba0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
ebb0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
ebc0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
ebd0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
ebe0: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53  L_OP_NO_COMPRESS
ebf0: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65  ION);./* disable
ec00: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65   compression eve
ec10: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a  n if supported *
ec20: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
ec30: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f  t_options(ctx, o
ec40: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65  ff);../* disable
ec50: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
ec60: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ns */.#if OPENSS
ec70: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
ec80: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   < 0x10101000L. 
ec90: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
eca0: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
ecb0: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f  E_AUTO_RETRY);./
ecc0: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e  * handle new han
ecd0: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67  dshakes in backg
ece0: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66  round. On by def
ecf0: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20  ault in OpenSSL 
ed00: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66  1.1.1. */.#endif
ed10: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
ed20: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
ed30: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
ed40: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
ed50: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
ed60: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
ed70: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
ed80: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
ed90: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
eda0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
edb0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
edc0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
edd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ede0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
edf0: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
ee00: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
ee10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
ee20: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
ee30: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
ee40: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
ee50: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
ee60: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
ee70: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
ee80: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
ee90: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
eea0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eeb0: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
eec0: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
eed0: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
eee0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
eef0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ef00: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
ef10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
ef20: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
ef30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65   */.    if (leve
ef40: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20  l > -1 && level 
ef50: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73  < 6) {../* SSL_s
ef60: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
ef70: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  l */..SSL_CTX_se
ef80: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
ef90: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20  (ctx, level);.  
efa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
efb0: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a  some callbacks *
efc0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
efd0: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
efe0: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72  _cb(ctx, Passwor
eff0: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  dCallback);.    
f000: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f010: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73  ult_passwd_cb_us
f020: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  erdata(ctx, (voi
f030: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a  d *)statePtr);..
f040: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69      /* read a Di
f050: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72  ffie-Hellman par
f060: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72  ameters file, or
f070: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   use the built-i
f080: 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c  n one */.    Tcl
f090: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
f0a0: 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  );.#ifdef OPENSS
f0b0: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
f0c0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f0d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f0e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
f0f0: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
f100: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
f110: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
f120: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
f130: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
f140: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
f150: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
f160: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
f170: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
f180: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62  IO *bio;...    b
f190: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c  io = BIO_new_fil
f1a0: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20  e(F2N(DHparams, 
f1b0: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20  &ds), "r");..   
f1c0: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54   if (!bio) {...T
f1d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f1e0: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  ds);...Tcl_Appen
f1f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f200: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20  "Could not find 
f210: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69  DH parameters fi
f220: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
f230: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
f240: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
f250: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
f260: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
f270: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
f280: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
f290: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
f2a0: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
f2b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
f2c0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
f2d0: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
f2e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f2f0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65  p, "Could not re
f300: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  ad DH parameters
f310: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68   from file", (ch
f320: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
f330: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f340: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f350: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c  ..    }..    SSL
f360: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
f370: 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44  ctx, dh);..    D
f380: 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20  H_free(dh);...} 
f390: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55  else {..    /* U
f3a0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48  se well known DH
f3b0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
f3c0: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73   have built-in s
f3d0: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53  upport in OpenSS
f3e0: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53  L */..    if (!S
f3f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75  SL_CTX_set_dh_au
f400: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09  to(ctx, 1)) {...
f410: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f420: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
f430: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44  not enable set D
f440: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45  H auto: ", GET_E
f450: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
f460: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
f470: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f480: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f490: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
f4a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f4b0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63  set our certific
f4c0: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f  ate */.    load_
f4d0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b  private_key = 0;
f4e0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
f4f0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  e != NULL) {..lo
f500: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
f510: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54   1;...if (SSL_CT
f520: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
f530: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
f540: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
f550: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
f560: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
f570: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f580: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
f590: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f5a0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
f5b0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
f5c0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
f5d0: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
f5e0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f5f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
f600: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f610: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
f620: 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72  LL;..}..Tcl_DStr
f630: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20  ingFree(&ds);.. 
f640: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65     } else if (ce
f650: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c  rt != NULL) {..l
f660: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
f670: 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54  = 1;..if (SSL_CT
f680: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
f690: 65 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 6e 74  e_ASN1(ctx, (int
f6a0: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74  ) cert_len, cert
f6b0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
f6c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f6d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
f6e0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
f6f0: 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52  te: ",...GET_ERR
f700: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
f710: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
f720: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f730: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f740: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
f750: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
f760: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
f770: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
f780: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
f790: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
f7a0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
f7b0: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
f7c0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
f7d0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
f7e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f7f0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
f800: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72   use default cer
f810: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
f820: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
f830: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f840: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f850: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f860: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f870: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23    return NULL;.#
f880: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a  endif..}.    }..
f890: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70      /* set our p
f8a0: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20  rivate key */.  
f8b0: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61    if (load_priva
f8c0: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b  te_key) {..if (k
f8d0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26  eyfile == NULL &
f8e0: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  & key == NULL) {
f8f0: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20  ..    keyfile = 
f900: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69  certfile;..}...i
f910: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55  f (keyfile != NU
f920: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65  LL) {..    /* ge
f930: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65  t the private ke
f940: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
f950: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61  h this certifica
f960: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b  te */..    if (k
f970: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  eyfile == NULL) 
f980: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65  {...keyfile = ce
f990: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a  rtfile;..    }..
f9a0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
f9b0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
f9c0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65  file(ctx, F2N(ke
f9d0: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  yfile, &ds), SSL
f9e0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
f9f0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  = 0) {...Tcl_DSt
fa00: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
fa10: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
fa20: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
fa30: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
fa40: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
fa50: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
fa60: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
fa70: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
fa80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fa90: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
faa0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69  et public key fi
fab0: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22  le ", keyfile, "
fac0: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52   ",...    GET_ER
fad0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
fae0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
faf0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
fb00: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
fb10: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
fb20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
fb30: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b  ;...} else if (k
fb40: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey != NULL) {.. 
fb50: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
fb60: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53  se_PrivateKey_AS
fb70: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c  N1(EVP_PKEY_RSA,
fb80: 20 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29   ctx, key, (int)
fb90: 20 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20   key_len) <= 0) 
fba0: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  {.../* flush the
fbb0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
fbc0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
fbd0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
fbe0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
fbf0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
fc00: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
fc10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fc20: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
fc30: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
fc40: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
fc50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
fc60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
fc70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
fc80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
fc90: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
fca0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
fcb0: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
fcc0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
fcd0: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
fce0: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
fcf0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
fd00: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
fd10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fd20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
fd30: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
fd40: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
fd50: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
fd60: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
fd70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
fd80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
fd90: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
fda0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
fdb0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75  .    /* Set to u
fdc0: 73 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74  se default locat
fdd0: 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72  ion and file for
fde0: 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74   Certificate Aut
fdf0: 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74  hority (CA) cert
fe00: 69 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20  ificates. The.  
fe10: 20 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68     * verify path
fe20: 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62   and store can b
fe30: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
fe40: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52  the SSL_CERT_DIR
fe50: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65   env var. The ve
fe60: 72 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20  rify file can.  
fe70: 20 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64     * be overridd
fe80: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
fe90: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e  RT_FILE env var.
fea0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
feb0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
fec0: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
fed0: 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a  x)) {..abort++;.
fee0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76      }..    /* Ov
fef0: 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20  errides for the 
ff00: 43 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61  CA verify path a
ff10: 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b  nd file */.    {
ff20: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
ff30: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
ff40: 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43  30000000L..if (C
ff50: 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Apath != NULL ||
ff60: 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29   CAfile != NULL)
ff70: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
ff80: 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63  ing ds1;..    Tc
ff90: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
ffa0: 73 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21  s1);...    if (!
ffb0: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
ffc0: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74  ify_locations(ct
ffd0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
ffe0: 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ds), F2N(CApath,
fff0: 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f   &ds1))) {...abo
10000 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
10010 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
10020 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
10030 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10040 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74  1);...    /* Set
10050 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20   list of CAs to 
10060 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77  send to client w
10070 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61  hen requesting a
10080 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63   client certific
10090 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68  ate */..    /* h
100a0 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72  ttps://sourcefor
100b0 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67  ge.net/p/tls/bug
100c0 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a  s/57/ */..    /*
100d0 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74   XXX:TODO: Let t
100e0 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76  he user supply v
100f0 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65  alues here inste
10100 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20  ad of something 
10110 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74  that exists on t
10120 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  he filesystem */
10130 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ..    STACK_OF(X
10140 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
10150 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
10160 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
10170 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
10180 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e  ;..    if (certN
10190 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ames != NULL) {.
101a0 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
101b0 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
101c0 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20  , certNames);.. 
101d0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
101e0 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
101f0 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43  .}..#else..if (C
10200 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b  Apath != NULL) {
10210 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
10220 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64  TX_load_verify_d
10230 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61  ir(ctx, F2N(CApa
10240 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61  th, &ds))) {...a
10250 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  bort++;..    }..
10260 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
10270 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66  ree(&ds);..}..if
10280 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
10290 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53  ) {..    if (!SS
102a0 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
102b0 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
102c0 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b  CAfile, &ds))) {
102d0 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20  ...abort++;..   
102e0 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
102f0 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09  ingFree(&ds);...
10300 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20      /* Set list 
10310 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74  of CAs to send t
10320 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65  o client when re
10330 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e  questing a clien
10340 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  t certificate */
10350 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ..    STACK_OF(X
10360 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
10370 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
10380 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
10390 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
103a0 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e  ;..    if (certN
103b0 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ames != NULL) {.
103c0 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
103d0 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
103e0 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20  , certNames);.. 
103f0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
10400 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
10410 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  .}.#endif.    }.
10420 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b  .    return ctx;
10430 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10480 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  . * StatusObjCmd
10490 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69   -- return certi
104a0 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65  ficate for conne
104b0 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a  cted peer.. *. *
104c0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
104d0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
104e0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
104f0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
10500 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
10510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
10550 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
10560 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10570 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
10580 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10590 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
105a0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
105b0 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
105c0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
105d0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
105e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
105f0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10600 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
10610 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
10620 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
10630 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
10640 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
10650 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
10660 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  int len;.    int
10670 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28   nid, res;.    (
10680 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
10690 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
106a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
106b0 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f  f (objc < 2 || o
106c0 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63  bjc > 3 || (objc
106d0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70   == 3 && !strcmp
106e0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
106f0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c  bjv[1]), "-local
10700 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  "))) {..Tcl_Wron
10710 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10720 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
10730 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
10740 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10750 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10760 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a  Get channel Id *
10770 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  /.    channelNam
10780 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10790 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20  g(objv[(objc == 
107a0 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20  2 ? 1 : 2)]);.  
107b0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
107c0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
107d0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
107e0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
107f0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
10800 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
10810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10820 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
10830 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
10840 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
10850 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
10860 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
10870 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
10880 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
10890 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
108a0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
108b0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
108c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
108d0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
108e0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
108f0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
10900 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
10910 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
10920 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
10930 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
10940 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
10950 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
10960 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
10970 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
10980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10990 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
109a0 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
109b0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
109c0 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
109d0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
109e0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
109f0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
10a00 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10a10 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
10a20 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
10a30 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10a40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
10a50 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
10a60 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10a70 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
10a80 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
10a90 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
10aa0 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
10ab0 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
10ac0 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
10ad0 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28  rp, peer);..if (
10ae0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
10af0 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
10b00 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
10b10 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
10b20 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
10b30 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10b40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
10b50 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
10b60 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
10b70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10b80 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53  r, "peername", S
10b90 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
10ba0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
10bb0 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
10bc0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10bd0 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53  jPtr, "sbits", S
10be0 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
10bf0 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
10c00 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63  , NULL));..    c
10c10 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
10c20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
10c30 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10c40 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10c50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10c60 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
10c70 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
10c80 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63  erify the X509 c
10c90 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65  ertificate prese
10ca0 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72  nted by the peer
10cb0 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10cc0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10cd0 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c  tr, "verifyResul
10ce0 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79  t",..X509_verify
10cf0 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
10d00 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
10d10 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
10d20 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a  r->ssl)), -1);..
10d30 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
10d40 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  de */.    mode =
10d50 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
10d60 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73  mode(statePtr->s
10d70 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64  sl);.    if (mod
10d80 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10d90 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44  NONE) {..LAPPEND
10da0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10db0 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
10dc0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
10dd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
10de0 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74  l_Obj *listObjPt
10df0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
10e00 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  bj(0, NULL);..if
10e10 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10e20 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20  RIFY_PEER) {..  
10e30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10e40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10e50 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
10e60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10e70 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d  "peer", -1));..}
10e80 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
10e90 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
10ea0 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
10eb0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10ec0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10ed0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10ee0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10ef0 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20  Obj("fail if no 
10f00 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29  peer cert", -1))
10f10 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
10f20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  & SSL_VERIFY_CLI
10f30 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20  ENT_ONCE) {..   
10f40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10f50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10f60 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10f70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10f80 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31  client once", -1
10f90 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
10fa0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
10fb0 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b  OST_HANDSHAKE) {
10fc0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10fd0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10fe0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10ff0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11000 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68  Obj("post handsh
11010 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ake", -1));..}..
11020 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
11030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
11040 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62  ifyMode", listOb
11050 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20  jPtr).    }..   
11060 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
11070 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50  depth */.    LAP
11080 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11090 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
110a0 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f  Depth", SSL_get_
110b0 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61  verify_depth(sta
110c0 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20  tePtr->ssl));.. 
110d0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
110e0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
110f0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11100 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
11110 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
11120 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
11130 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
11140 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
11150 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
11160 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
11170 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72  lpn", (char *)pr
11180 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
11190 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
111a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
111b0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
111c0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
111d0 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
111e0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
111f0 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41  alid for non-RSA
11200 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54   signature and T
11210 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66  LS 1.3 */.    if
11220 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
11230 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
11240 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  er_signature_nid
11250 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11260 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
11270 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
11280 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  et_signature_nid
11290 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
112a0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
112b0 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
112c0 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
112d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
112e0 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
112f0 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20  HashAlgorithm", 
11300 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
11310 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64   -1);..    /* Ad
11320 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ded in OpenSSL 1
11330 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45  .1.1a */.#if OPE
11340 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
11350 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30  BER > 0x10101000
11360 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  L.    if (objc =
11370 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
11380 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
11390 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
113a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
113b0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
113c0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
113d0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
113e0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
113f0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
11400 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
11410 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
11420 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11430 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
11440 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
11450 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23  2ln(nid), -1);.#
11460 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53  endif..    Tcl_S
11470 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11480 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
11490 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
114a0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
114f0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66   * ConnectionInf
11500 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  oObjCmd -- retur
11510 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  n connection inf
11520 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  o from OpenSSL..
11530 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
11540 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e  *.A list of conn
11550 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a  ection info.  *.
11560 20 2a 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 2d 2d 2d 2d  ----------------
11580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115a0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
115b0 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e  c int Connection
115c0 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  InfoObjCmd(Clien
115d0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
115e0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
115f0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
11600 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
11610 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
11620 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
11630 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
11640 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20  o set a mode on 
11650 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
11660 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
11670 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
11680 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
11690 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
116a0 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
116b0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
116c0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
116d0 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
116e0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
116f0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
11700 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
11710 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
11720 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  entData;..    if
11730 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
11740 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11750 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11760 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
11770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
11790 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
117a0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
117b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
117c0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
117d0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
117e0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
117f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11800 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11810 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
11820 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
11830 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
11840 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
11850 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
11860 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
11870 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
11880 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
11890 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
118a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
118b0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
118c0 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
118d0 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
118e0 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
118f0 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
11900 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11910 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
11920 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
11930 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
11940 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
11950 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
11960 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
11970 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11980 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
11990 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
119a0 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
119b0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
119c0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
119d0 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
119e0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
119f0 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
11a00 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
11a10 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
11a20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f  = NULL) {../* co
11a30 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a  nnection state *
11a40 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11a50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11a60 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74  state", SSL_stat
11a70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
11a80 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  l), -1);.../* Ge
11a90 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20  t SNI requested 
11aa0 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  server name */..
11ab0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11ac0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72  rp, objPtr, "ser
11ad0 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  vername", SSL_ge
11ae0 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
11af0 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
11b00 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31  E_host_name), -1
11b10 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74  );.../* Get prot
11b20 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  ocol */..LAPPEND
11b30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11b40 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  Ptr, "protocol",
11b50 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e   SSL_get_version
11b60 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  (ssl), -1);.../*
11b70 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61   Renegotiation a
11b80 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45  llowed */..LAPPE
11b90 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11ba0 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74  objPtr, "renegot
11bb0 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c  iation_allowed",
11bc0 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f   SSL_get_secure_
11bd0 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75  renegotiation_su
11be0 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73  pport((SSL *) ss
11bf0 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65  l));.../* Get se
11c00 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
11c10 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
11c20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11c30 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53  curity_level", S
11c40 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
11c50 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f  level(ssl));.../
11c60 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11c70 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11c80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11c90 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
11ca0 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  , SSL_session_re
11cb0 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  used(ssl));.../*
11cc0 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
11cd0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11ce0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11cf0 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53   "is_server", SS
11d00 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
11d10 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20  );.../* Is DTLS 
11d20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11d30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d40 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f   "is_dtls", SSL_
11d50 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20  is_dtls(ssl));. 
11d60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
11d70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
11d80 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
11d90 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
11da0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
11db0 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
11dc0 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
11dd0 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
11de0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
11df0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a  /* Cipher name *
11e00 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11e10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11e20 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50  cipher", SSL_CIP
11e30 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
11e40 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11e50 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
11e60 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
11e70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11e80 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  r, "standard_nam
11e90 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73  e", SSL_CIPHER_s
11ea0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
11eb0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11ec0 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20  OpenSSL name of 
11ed0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11ee0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11ef0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f  bjPtr, "openssl_
11f00 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63  name", OPENSSL_c
11f10 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43  ipher_name(SSL_C
11f20 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
11f30 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31  ame(cipher)), -1
11f40 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f  );.../* number o
11f50 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73  f secret bits us
11f60 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f  ed for cipher */
11f70 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
11f80 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
11f90 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
11fa0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11fb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11fc0 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74  ecret_bits", bit
11fd0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
11fe0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11ff0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73   "algorithm_bits
12000 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f  ", alg_bits);../
12010 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63  * alg_bits is ac
12020 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20  tual key secret 
12030 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74  bits. If use bit
12040 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c  s and secret (al
12050 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69  gorithm) bits di
12060 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65  ffer,..   the re
12070 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61  st of the bits a
12080 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66  re fixed, i.e. f
12090 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72  or limited expor
120a0 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20  t ciphers (bits 
120b0 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e  < 56) */.../* In
120c0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53  dicates which SS
120d0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76  L/TLS protocol v
120e0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66  ersion first def
120f0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20  ined the cipher 
12100 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
12110 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12120 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53  "min_version", S
12130 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
12140 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
12150 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  1);.../* Cipher 
12160 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  NID */..LAPPEND_
12170 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12180 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c  tr, "cipherNID",
12190 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
121a0 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
121b0 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69  et_cipher_nid(ci
121c0 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
121d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
121e0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73  , objPtr, "diges
121f0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  tNID", (char *)O
12200 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
12210 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f  PHER_get_digest_
12220 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12230 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12240 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12250 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22  "keyExchangeNID"
12260 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12270 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12280 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65  get_kx_nid(ciphe
12290 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
122a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
122b0 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69  bjPtr, "authenti
122c0 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61  cationNID", (cha
122d0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
122e0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75  SL_CIPHER_get_au
122f0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  th_nid(cipher)),
12300 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61   -1);.../* messa
12310 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
12320 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20  n code - Cipher 
12330 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43  is AEAD (e.g. GC
12340 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f  M or ChaCha20/Po
12350 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a  ly1305) or not *
12360 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61  /../* Authentica
12370 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77  ted Encryption w
12380 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64  ith associated d
12390 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b  ata (AEAD) check
123a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
123b0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
123c0 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61  , "cipher_is_aea
123d0 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69  d", SSL_CIPHER_i
123e0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b  s_aead(cipher));
123f0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
12400 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
12410 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
12420 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
12430 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
12440 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
12450 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
12460 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
12470 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12480 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
12490 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
124a0 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
124b0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
124c0 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
124d0 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
124e0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
124f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12500 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69   "cipher_id", (i
12510 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
12520 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  et_id(cipher));.
12530 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44  ../* Two-byte ID
12540 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53   used in the TLS
12550 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65   protocol of the
12560 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f   given cipher */
12570 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12580 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
12590 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e  rotocol_id", (in
125a0 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
125b0 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69  t_protocol_id(ci
125c0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78  pher));.../* Tex
125d0 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
125e0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
125f0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  /..if (SSL_CIPHE
12600 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69  R_description(ci
12610 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f  pher, buf, sizeo
12620 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
12630 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
12640 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12650 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e  tr, "description
12660 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a  ", buf, -1);..}.
12670 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
12680 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
12690 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
126a0 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
126b0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
126c0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
126d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
126e0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
126f0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
12700 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
12710 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12720 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
12730 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
12740 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c   char buffer[SSL
12750 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
12760 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
12770 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
12780 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
12790 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
127a0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
127b0 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
127c0 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
127d0 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
127e0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
127f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12800 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
12810 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
12820 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
12830 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
12840 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
12850 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
12860 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
12870 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
12880 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
12890 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
128a0 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
128b0 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
128c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
128d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
128e0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
128f0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12900 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
12910 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
12920 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
12930 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
12940 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
12950 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
12960 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
12970 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12980 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
12990 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
129a0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
129b0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
129c0 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
129d0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
129e0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
129f0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
12a00 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
12a10 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
12a20 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12a30 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12a40 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
12a50 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
12a60 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
12a70 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
12a80 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
12a90 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
12aa0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
12ab0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12ac0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
12ad0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
12ae0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12af0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
12b00 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
12b10 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
12b20 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
12b30 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
12b40 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
12b50 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
12b60 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
12b70 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
12b80 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
12b90 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
12ba0 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
12bb0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12bc0 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
12bd0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
12be0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
12bf0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
12c00 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
12c10 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
12c20 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12c30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12c40 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
12c50 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
12c60 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
12c70 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
12c80 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
12c90 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12ca0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12cb0 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
12cc0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
12cd0 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
12ce0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
12cf0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
12d00 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20  app data */.#if 
12d10 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12d20 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
12d30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f  000L..SSL_SESSIO
12d40 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
12d50 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49  pdata((SSL_SESSI
12d60 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26  ON *) session, &
12d70 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
12d80 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
12d90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12da0 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61  "ticket_app_data
12db0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
12dc0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e  Size) len2);.#en
12dd0 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  dif.../* Get mas
12de0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
12df0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12e00 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
12e10 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
12e20 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
12e30 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
12e40 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12e50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
12e60 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
12e70 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12e80 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
12e90 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
12ea0 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
12eb0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
12ec0 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
12ed0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12ee0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12ef0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
12f00 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
12f10 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
12f20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12f30 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
12f40 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
12f50 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
12f60 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
12f70 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
12f80 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
12f90 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
12fa0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12fb0 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
12fc0 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
12fd0 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
12fe0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
12ff0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13000 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
13010 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
13020 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
13030 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
13040 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
13050 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13060 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
13070 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
13080 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
13090 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
130a0 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
130b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
130c0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
130d0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
130e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
130f0 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
13100 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
13110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
13120 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
13130 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
13140 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
13150 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
13160 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
13170 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
13180 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
13190 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
131a0 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
131b0 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
131c0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
131d0 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
131e0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
131f0 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
13200 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
13210 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
13220 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
13230 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
13240 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
13250 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
13260 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
13270 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
13280 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
13290 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
132a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
132b0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
132c0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
132d0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
132e0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
132f0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
13300 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
13310 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
13320 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
13330 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
13340 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
13350 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
13360 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
13370 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
13380 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
13390 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
133a0 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
133b0 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
133c0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
133d0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
133e0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
133f0 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ];..for (int i =
13400 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f   0; i < sk_X509_
13410 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
13420 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
13430 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d  509_NAME *name =
13440 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61   sk_X509_NAME_va
13450 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b  lue(ca_list, i);
13460 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20  ..    if (name) 
13470 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e  {...X509_NAME_on
13480 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66  eline(name, buff
13490 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54  er, BUFSIZ);...T
134a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
134b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
134c0 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
134d0 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
134e0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09  , -1));..    }..
134f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50  }.    }.    LAPP
13500 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
13510 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22  objPtr, "caList"
13520 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20  , listPtr);.    
13530 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
13540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
13550 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35  istCount", sk_X5
13560 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c  09_NAME_num(ca_l
13570 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ist));..    Tcl_
13580 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13590 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
135a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
135b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13600 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  . * VersionObjCm
13610 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73  d -- return vers
13620 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ion string from 
13630 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
13640 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
13650 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
13660 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
13670 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
13680 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
136d0 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62  ic int.VersionOb
136e0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
136f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
13700 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
13710 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
13720 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
13730 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
13740 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69  objPtr;.    (voi
13750 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  d) clientData;. 
13760 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a     (void) objc;.
13770 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b      (void) objv;
13780 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
13790 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62  alled");..    ob
137a0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
137b0 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
137c0 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
137d0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
137e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
137f0 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65  objPtr);..    re
13800 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
13810 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13850 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
13860 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69  MiscObjCmd -- mi
13870 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  sc commands. *. 
13880 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
13890 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
138a0 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
138b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
138c0 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
13910 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62  tatic int.MiscOb
13920 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
13930 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
13940 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
13950 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
13960 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
13970 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
13980 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e  nst char *comman
13990 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c  ds [] = { "req",
139a0 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20   "strreq", NULL 
139b0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d  };.    enum comm
139c0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53  and { C_REQ, C_S
139d0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  TRREQ, C_DUMMY }
139e0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
139f0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74  md;.    int isSt
13a00 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
13a10 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28  er[16384];.    (
13a20 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
13a30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
13a40 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
13a50 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
13a60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13a70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
13a80 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
13a90 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
13aa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13ab0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
13ac0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
13ad0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
13ae0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
13af0 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54  ", 0, &cmd) != T
13b00 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
13b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13b20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
13b30 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
13b40 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
13b50 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
13b60 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
13b70 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
13b80 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
13b90 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
13ba0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
13bb0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
13bc0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
13bd0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
13be0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
13bf0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
13c00 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b   Tcl_Size listc;
13c10 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20  ..    int i;... 
13c20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
13c30 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
13c40 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
13c50 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
13c60 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
13c70 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
13c80 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
13c90 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
13ca0 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
13cb0 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
13cc0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13cd0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13ce0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13cf0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
13d00 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
13d10 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
13d20 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
13d30 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
13d40 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
13d50 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
13d60 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
13d70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13d80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
13d90 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
13da0 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
13db0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13dc0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
13dd0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
13de0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13df0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
13e00 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13e10 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13e20 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
13e30 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
13e40 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
13e50 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
13e60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
13e70 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
13e80 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
13e90 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
13ea0 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
13eb0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
13ec0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
13ed0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
13ee0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
13ef0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
13f00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
13f10 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  , &listc, &listv
13f20 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13f30 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13f40 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
13f50 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
13f60 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
13f70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
13f80 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
13f90 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
13fa0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13fb0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
13fc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13fd0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
13fe0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
13ff0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
14000 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14010 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
14020 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
14030 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
14040 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
14050 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
14060 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
14070 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
14080 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
14090 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
140a0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
140b0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
140c0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
140d0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
140e0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
140f0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
14100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14110 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
14120 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
14130 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
14140 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14150 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
14160 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14170 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
14180 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
14190 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
141a0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
141b0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
141c0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
141d0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
141e0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
141f0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
14200 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
14210 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
14220 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14230 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14240 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14250 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
14260 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
14270 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14280 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14290 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
142a0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
142b0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
142c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
142d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
142e0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
142f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
14300 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
14310 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
14320 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
14330 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14340 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
14350 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
14360 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
14370 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
14380 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
14390 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
143a0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
143b0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
143c0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
143d0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
143e0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
143f0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
14400 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
14410 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
14420 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
14430 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
14440 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
14450 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
14460 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
14470 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
14480 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
14490 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
144a0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
144b0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
144c0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
144d0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
144e0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
144f0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
14500 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
14510 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
14520 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
14530 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
14540 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
14550 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
14560 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
14570 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
14580 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
14590 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
145a0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
145b0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
145c0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
145d0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
145e0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
145f0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
14600 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
14610 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
14620 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
14630 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
14640 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
14650 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
14660 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
14670 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
14680 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
14690 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
146a0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
146b0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
146c0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
146d0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
146e0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
146f0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
14700 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
14710 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
14720 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
14730 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
14740 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
14750 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
14760 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
14770 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
14780 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
14790 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
147a0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
147b0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
147c0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
147d0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
147e0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
147f0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
14800 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
14810 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
14820 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
14830 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
14840 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
14850 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
14860 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
14870 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
14880 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
14890 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
148a0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
148b0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
148c0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
148d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
148e0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
148f0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
14900 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
14910 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
14920 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
14930 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14940 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
14950 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
14960 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
14970 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
14980 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58  _ERROR;...}....X
14990 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28  509_set_version(
149a0 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f  cert,2);...ASN1_
149b0 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39  INTEGER_set(X509
149c0 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65  _get_serialNumbe
149d0 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b  r(cert),serial);
149e0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
149f0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
14a00 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
14a10 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
14a20 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
14a30 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e  After(cert),(lon
14a40 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29  g)60*60*24*days)
14a50 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62  ;...X509_set_pub
14a60 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a  key(cert,pkey);.
14a70 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74  ...name=X509_get
14a80 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
14a90 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d  rt);....X509_NAM
14aa0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14ab0 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53  xt(name,"C", MBS
14ac0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14ad0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14ae0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_C, -1, -1, 
14af0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14b00 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14b10 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54  (name,"ST", MBST
14b20 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14b30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14b40 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_ST, -1, -1, 
14b50 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14b60 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14b70 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52  (name,"L", MBSTR
14b80 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14b90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14ba0 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_L, -1, -1, 0)
14bb0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14bc0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14bd0 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e  ame,"O", MBSTRIN
14be0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14bf0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14c00 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _O, -1, -1, 0);.
14c10 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14c20 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14c30 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47  e,"OU", MBSTRING
14c40 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14c50 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14c60 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  OU, -1, -1, 0);.
14c70 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14c80 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14c90 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47  e,"CN", MBSTRING
14ca0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14cb0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14cc0 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  CN, -1, -1, 0);.
14cd0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14ce0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14cf0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52  e,"Email", MBSTR
14d00 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14d10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14d20 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31   k_Email, -1, -1
14d30 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65  , 0);....X509_se
14d40 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
14d50 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66  ert,name);....if
14d60 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72   (!X509_sign(cer
14d70 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35  t,pkey,EVP_sha25
14d80 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35  6())) {...    X5
14d90 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
14da0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
14db0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
14dc0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
14dd0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
14de0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
14df0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
14e00 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
14e10 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
14e20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63  signing certific
14e30 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  ate",NULL);...  
14e40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14e50 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69  OR;...}....if (i
14e60 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
14e70 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
14e80 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
14e90 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14ea0 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14eb0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74    i=BIO_read(out
14ec0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62  ,buffer,sizeof(b
14ed0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20  uffer)-1);...   
14ee0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69   i=(i<0) ? 0 : i
14ef0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69  ;...    buffer[i
14f00 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63  ]='\0';...    Tc
14f10 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
14f20 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29  pemout,buffer,0)
14f30 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73  ;...    BIO_flus
14f40 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49  h(out);...    BI
14f50 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d  O_free(out);...}
14f60 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75   else {...    ou
14f70 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
14f80 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42  file());...    B
14f90 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d  IO_write_filenam
14fa0 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09  e(out,pemout);..
14fb0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
14fc0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
14fd0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
14fe0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a  e_all(out);...}.
14ff0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72  ...X509_free(cer
15000 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  t);...EVP_PKEY_f
15010 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
15020 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
15030 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
15040 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e  00L...BN_free(bn
15050 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20  e);.#endif..    
15060 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20  }..}..break;.   
15070 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b   default:..break
15080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15090 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
150a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150b0 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20  ****/./* Init   
150c0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a            */./**
150d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150e0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15130 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a  . * Tls_Free --.
15140 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
15150 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
15160 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
15170 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
15180 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
15190 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
151a0 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
151b0 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  1. *. * Results:
151c0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
151d0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
151e0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
151f0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
15240 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74  .void.Tls_Free(t
15250 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c  ls_free_type *bl
15260 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74  ockPtr) {.    St
15270 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
15280 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74  (State *)blockPt
15290 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
152a0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
152b0 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50  Tls_Clean(stateP
152c0 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  tr);.    ckfree(
152d0 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
152e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15320 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
15330 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
15340 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
15350 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
15360 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
15370 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
15380 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
15390 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
153a0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
153b0 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
153c0 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
153d0 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
153e0 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
153f0 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
15400 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
15410 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
15420 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
15430 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
15440 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
15450 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
154a0 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id Tls_Clean(Sta
154b0 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
154c0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
154d0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  led");..    /*. 
154e0 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75      * we're assu
154f0 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77  ming here that w
15500 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65  e're single-thre
15510 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  aded.     */.   
15520 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
15530 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
15540 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
15550 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
15560 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
15570 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
15580 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
15590 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
155a0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
155b0 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73  tos) {..ckfree(s
155c0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
155d0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
155e0 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tos = NULL;.    
155f0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15600 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54  tr->bio) {../* T
15610 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53  his will call SS
15620 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20  L_shutdown. Bug 
15630 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69  1414045 */..dpri
15640 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c  ntf("BIO_free_al
15650 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  l(%p)", statePtr
15660 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65  ->bio);..BIO_fre
15670 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e  e_all(statePtr->
15680 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  bio);..statePtr-
15690 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >bio = NULL;.   
156a0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
156b0 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72  Ptr->ssl) {..dpr
156c0 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25  intf("SSL_free(%
156d0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
156e0 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73  sl);..SSL_free(s
156f0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
15700 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
15710 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
15720 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74  if (statePtr->ct
15730 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  x) {..SSL_CTX_fr
15740 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ee(statePtr->ctx
15750 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74  );..statePtr->ct
15760 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  x = NULL;.    }.
15770 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
15780 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54  ->callback) {..T
15790 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
157a0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
157b0 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ck);..statePtr->
157c0 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b  callback = NULL;
157d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
157e0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
157f0 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
15800 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
15810 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61  >password);..sta
15820 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
15830 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
15840 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
15850 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  vcmd) {..Tcl_Dec
15860 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
15870 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74  tr->vcmd);..stat
15880 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c  ePtr->vcmd = NUL
15890 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  L;.    }..    dp
158a0 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
158b0 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ");.}.../*. *---
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20  ---. *. * Build 
15910 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a  Info Command --.
15920 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d   *. *.Create com
15930 6d 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62  mand to return b
15940 75 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61  uild info for pa
15950 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  ckage.. *. * Res
15960 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
15970 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20  ard Tcl result. 
15980 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
15990 73 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75  s:. *.Created bu
159a0 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  ild-info command
159b0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15a00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e  /..#ifndef STRIN
15a10 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53  GIFY.#  define S
15a20 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49  TRINGIFY(x) STRI
15a30 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66  NGIFY1(x).#  def
15a40 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78  ine STRINGIFY1(x
15a50 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74  ) #x.#endif..int
15a60 0a 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e  .BuildInfoComman
15a70 64 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e  d(Tcl_Interp* in
15a80 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f  terp) {.    Tcl_
15a90 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  CmdInfo info;.. 
15aa0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f     if (Tcl_GetCo
15ab0 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
15ac0 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d  , "::tcl::build-
15ad0 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b  info", &info)) {
15ae0 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  ..Tcl_CreateObjC
15af0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15b00 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66  ::tls::build-inf
15b10 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63  o", info.objProc
15b20 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41  , (void *)(...PA
15b30 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b  CKAGE_VERSION "+
15b40 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f  " STRINGIFY(TLS_
15b50 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69  VERSION_UUID).#i
15b60 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e  f defined(__clan
15b70 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  g__) && defined(
15b80 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29  __clang_major__)
15b90 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d  ....    ".clang-
15ba0 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c  " STRINGIFY(__cl
15bb0 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66  ang_major__).#if
15bc0 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f   __clang_minor__
15bd0 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22   < 10....    "0"
15be0 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53  .#endif....    S
15bf0 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
15c00 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66  _minor__).#endif
15c10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63  .#if defined(__c
15c20 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65  plusplus) && !de
15c30 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a  fined(__OBJC__).
15c40 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c  ...    ".cpluspl
15c50 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  us".#endif.#ifnd
15c60 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20  ef NDEBUG....   
15c70 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66   ".debug".#endif
15c80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
15c90 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66  clang__) && !def
15ca0 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  ined(__INTEL_COM
15cb0 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65  PILER) && define
15cc0 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20  d(__GNUC__).... 
15cd0 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e     ".gcc-" STRIN
15ce0 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23  GIFY(__GNUC__).#
15cf0 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f  if __GNUC_MINOR_
15d00 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30  _ < 10....    "0
15d10 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20  ".#endif....    
15d20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43  STRINGIFY(__GNUC
15d30 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66  _MINOR__).#endif
15d40 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f  .#ifdef __INTEL_
15d50 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20  COMPILER....    
15d60 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".icc-" STRINGIF
15d70 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  Y(__INTEL_COMPIL
15d80 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ER).#endif.#ifde
15d90 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a  f TCL_MEM_DEBUG.
15da0 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75  ...    ".memdebu
15db0 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  g".#endif.#if de
15dc0 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a  fined(_MSC_VER).
15dd0 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20  ...    ".msvc-" 
15de0 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56  STRINGIFY(_MSC_V
15df0 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ER).#endif.#ifde
15e00 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20  f USE_NMAKE.... 
15e10 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64     ".nmake".#end
15e20 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43  if.#ifndef TCL_C
15e30 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09  FG_OPTIMIZED....
15e40 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a      ".no-optimiz
15e50 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e".#endif.#ifdef
15e60 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20   __OBJC__....   
15e70 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a   ".objective-c".
15e80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70  #if defined(__cp
15e90 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20  lusplus)....    
15ea0 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69  "plusplus".#endi
15eb0 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  f.#endif.#ifdef 
15ec0 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44  TCL_CFG_PROFILED
15ed0 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c  ....    ".profil
15ee0 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e".#endif.#ifdef
15ef0 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22   PURIFY....    "
15f00 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a  .purify".#endif.
15f10 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55  #ifdef STATIC_BU
15f20 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61  ILD....    ".sta
15f30 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c  tic".#endif...),
15f40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20   NULL);.    }.  
15f50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15f60 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
15f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15fb0 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
15fc0 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
15fd0 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
15fe0 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
15ff0 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
16000 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
16010 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
16020 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
16030 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
16040 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
16050 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
16060 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
16070 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
16080 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
16090 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
160a0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
160b0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
160c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23  ---------. */..#
16100 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  if TCL_MAJOR_VER
16110 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65  SION > 8.#define
16120 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e   MIN_VERSION "9.
16130 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  0".#else.#define
16140 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e   MIN_VERSION "8.
16150 35 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  5".#endif..stati
16160 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73  c const char tls
16170 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20  TclInitScript[] 
16180 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  = {.#include "tl
16190 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20  s.tcl.h"..0x00. 
161a0 20 20 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54     };..DLLEXPORT
161b0 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63   int Tls_Init(Tc
161c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
161d0 29 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
161e0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
161f0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
16200 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e  S.    if (Tcl_In
16210 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
16220 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
16230 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
16240 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16250 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
16260 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72  f (Tcl_PkgRequir
16270 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c  e(interp, "Tcl",
16280 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29   MIN_VERSION, 0)
16290 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
162a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
162b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c     }..    if (Tl
162c0 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54  sLibInit(0) != T
162d0 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70  CL_OK) {..Tcl_Ap
162e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
162f0 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e  p, "could not in
16300 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62  itialize SSL lib
16310 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20  rary", (char *) 
16320 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
16330 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
16340 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
16350 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
16360 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72  , "::tls::cipher
16370 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
16380 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
16390 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
163a0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
163b0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
163c0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
163d0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e  rp, "::tls::conn
163e0 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74  ection", Connect
163f0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28  ionInfoObjCmd, (
16400 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
16410 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
16420 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
16430 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
16440 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
16450 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b  "::tls::handshak
16460 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  e", HandshakeObj
16470 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
16480 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
16490 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
164a0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
164b0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
164c0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d  terp, "::tls::im
164d0 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
164e0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
164f0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
16500 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
16510 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
16520 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
16530 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e  terp, "::tls::un
16540 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
16550 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
16560 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
16570 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
16580 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
16590 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
165a0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
165b0 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d  ::unstack", Unim
165c0 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
165d0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
165e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
165f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
16600 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
16610 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
16620 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74  tls::status", St
16630 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  atusObjCmd, (Cli
16640 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
16650 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
16660 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
16670 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
16680 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
16690 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
166a0 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
166b0 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
166c0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
166d0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
166e0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
166f0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
16700 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69  ::tls::misc", Mi
16710 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  scObjCmd, (Clien
16720 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
16730 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
16740 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
16750 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
16760 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
16770 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50  s::protocols", P
16780 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20  rotocolsObjCmd, 
16790 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
167a0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
167b0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
167c0 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f  .    BuildInfoCo
167d0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a  mmand(interp);..
167e0 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 26      if (interp &
167f0 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72  & Tcl_Eval(inter
16800 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  p, tlsTclInitScr
16810 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ipt) != TCL_OK) 
16820 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
16830 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
16840 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72  return Tcl_PkgPr
16850 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41  ovide(interp, PA
16860 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b  CKAGE_NAME, PACK
16870 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a  AGE_VERSION);.}.
16880 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
16890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
168c0 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
168d0 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
168e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53  ----------*. *.S
16910 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72  tandard procedur
16920 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c  e required by 'l
16930 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c  oad'.. *.Initial
16940 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73  izes this extens
16950 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69  ion for a safe i
16960 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d  nterpreter.. *.-
16970 2d 2d 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 2a  ---------------*
169a0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
169b0 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27  cts:. *..As of '
169c0 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09  Tls_Init'. *. *.
169d0 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74  Result:. *..A st
169e0 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72  andard Tcl error
169f0 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   code.. *. *----
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52  --*. */.DLLEXPOR
16a40 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e  T int Tls_SafeIn
16a50 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
16a60 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72  nterp) {.    dpr
16a70 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
16a80 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49      return Tls_I
16a90 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a  nit(interp);.}..
16aa0 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
16ae0 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
16af0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b20 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
16b30 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
16b40 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
16b50 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
16b90 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
16ba0 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
16bb0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
16bc0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
16bd0 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
16be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16bf0 2d 2d 2d 2d 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 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
16c20 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
16c30 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
16c40 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
16c50 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
16c60 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
16c70 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
16c80 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16c90 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16ca0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
16cb0 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
16cc0 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
16cd0 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
16ce0 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
16cf0 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
16d00 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
16d10 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
16d20 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
16d30 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
16d40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16d50 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41  ..}...dprintf("A
16d60 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
16d70 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66  lize");..#if def
16d80 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16d90 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16da0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
16db0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
16dc0 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f  it_mx);...if (lo
16dd0 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65  cks) {..    free
16de0 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f  (locks);..    lo
16df0 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  cks = NULL;..   
16e00 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b   locksCount = 0;
16e10 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74  ..}.#endif..init
16e20 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69  ialized = 0;..#i
16e30 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
16e40 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
16e50 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
16e60 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c  S)..Tcl_MutexUnl
16e70 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
16e80 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 54  endif...return T
16e90 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  CL_OK;.    }..  
16ea0 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
16eb0 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
16ec0 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
16ed0 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
16ee0 0a 09 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b  ..return status;
16ef0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
16f00 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
16f10 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
16f20 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
16f30 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
16f40 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74  ADS).    Tcl_Mut
16f50 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
16f60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69  ;.#endif.    ini
16f70 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23  tialized = 1;..#
16f80 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16f90 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16fa0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16fb0 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b  DS).    num_lock
16fc0 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73  s = 1;.    locks
16fd0 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75  Count = (int) nu
16fe0 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63  m_locks;.    loc
16ff0 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ks = malloc(size
17000 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d  of(*locks) * num
17010 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d  _locks);.    mem
17020 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69  set(locks, 0, si
17030 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
17040 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69  um_locks);.#endi
17050 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  f..    /* Initia
17060 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79  lize BOTH libcry
17070 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20  pto and libssl. 
17080 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69  */.    OPENSSL_i
17090 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f  nit_ssl(OPENSSL_
170a0 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54  INIT_LOAD_SSL_ST
170b0 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  RINGS | OPENSSL_
170c0 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f  INIT_LOAD_CRYPTO
170d0 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e  _STRINGS..| OPEN
170e0 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
170f0 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53  _CIPHERS | OPENS
17100 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
17110 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a  DIGESTS, NULL);.
17120 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  .    BIO_new_tcl
17130 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20  (NULL, 0);..#if 
17140 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
17150 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
17160 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
17170 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
17180 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
17190 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
171a0 73 74 61 74 75 73 3b 0a 7d 0a                    status;.}.