Hex Artifact Content

Artifact 69b432401c0edea17d16b1864e234480bec8a0bca3d27d3e25002352d5b994e8:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
04f0: 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  *CTX_Init(State 
0500: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
0510: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
0520: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09  to, char *key,..
0530: 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c  .char *certfile,
0540: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0550: 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e  key_asn1, unsign
0560: 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73  ed char *cert_as
0570: 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73  n1,...int key_as
0580: 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74  n1_len, int cert
0590: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20  _asn1_len, char 
05a0: 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20 2a 43  *CApath, char *C
05b0: 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63  Afile,...char *c
05c0: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69  iphers, char *ci
05d0: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20  phersuites, int 
05e0: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70  level, char *DHp
05f0: 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20  arams);..static 
0600: 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69  int.TlsLibInit(i
0610: 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  nt uninitialize)
0620: 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  ;..#define TLS_P
0630: 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a  ROTO_SSL2..0x01.
0640: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0650: 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65  O_SSL3..0x02.#de
0660: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0670: 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e  LS1..0x04.#defin
0680: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
0690: 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20  _1.0x08.#define 
06a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
06b0: 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c  .0x10.#define TL
06c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30  S_PROTO_TLS1_3.0
06d0: 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42  x20.#define ENAB
06e0: 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09  LED(flag, mask).
06f0: 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b  (((flag) & (mask
0700: 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23  )) == (mask))..#
0710: 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47  define SSLKEYLOG
0720: 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47  FILE.."SSLKEYLOG
0730: 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 72  FILE"../*. * Thr
0740: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
0750: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
0760: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0770: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0780: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0790: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
07a0: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
07b0: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
07c0: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
07d0: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
07e0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
07f0: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0800: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
0810: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
0820: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
0830: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
0840: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
0850: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
0860: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0870: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0880: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0890: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
08a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
08b0: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
08c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
08d0: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
08e0: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
08f0: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0910: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
0920: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0940: 2f 2a 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0990: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
09a0: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
09b0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
09c0: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
09d0: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
09e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
09f0: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a00: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0a10: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0a20: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0a30: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0a40: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0a50: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0a60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0a70: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0a80: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0a90: 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0ae0: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0af0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b00: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0b10: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0b20: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0b30: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0b40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
0b50: 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  d");..    Tcl_Pr
0b60: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
0b70: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
0b80: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
0b90: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
0ba0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  Ptr);..    /* Ev
0bb0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  al callback with
0bc0: 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20   success for ok 
0bd0: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  or return value 
0be0: 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f  1, fail for erro
0bf0: 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75  r or return valu
0c00: 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52  e 0 */.    Tcl_R
0c10: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
0c20: 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54  p);.    code = T
0c30: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
0c40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
0c50: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
0c60: 20 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c     dprintf("Eval
0c70: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63  Callback: %d", c
0c80: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  ode);.    if (co
0c90: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0ca0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0cb0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cc0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0cd0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0ce0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0cf0: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d00: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d10: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d20: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d30: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d40: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70    ok = 1;..}..dp
0d50: 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25  rintf("Result: %
0d60: 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65  d", ok);.    } e
0d70: 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20  lse {../* Error 
0d80: 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72  - reject the cer
0d90: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72  tificate */..dpr
0da0: 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72  intf("Tcl_Backgr
0db0: 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66  oundError");.#if
0dc0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
0dd0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
0de0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
0df0: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
0e00: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
0e10: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61  );.#else..Tcl_Ba
0e20: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f  ckgroundExceptio
0e30: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  n(interp, code);
0e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
0e50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
0e60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
0e70: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
0e80: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
0e90: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
0ea0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a   return ok;.}...
0eb0: 2f 2a 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 49  --------. *. * I
0f00: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0f10: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
0f20: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0f30: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0f40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0f50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0f60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0f70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0f80: 2a 0a 20 2a 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
0fd0: 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c  ic void.InfoCall
0fe0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
0ff0: 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20  ssl, int where, 
1000: 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53  int ret) {.    S
1010: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
1020: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74   (State*)SSL_get
1030: 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a  _app_data((SSL *
1040: 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49  )ssl);.    Tcl_I
1050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
1060: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1070: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
1080: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20  mdPtr;.    char 
1090: 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69  *major; char *mi
10a0: 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  nor;..    dprint
10b0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
10c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
10d0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
10e0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74  _Obj*)NULL)..ret
10f0: 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68  urn;..    if (wh
1100: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e  ere & SSL_CB_HAN
1110: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a  DSHAKE_START) {.
1120: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1130: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1140: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c  start";.    } el
1150: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1160: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f  SL_CB_HANDSHAKE_
1170: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  DONE) {..major =
1180: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1190: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20  inor = "done";. 
11a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
11b0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
11c0: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20  ALERT)..major = 
11d0: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69  "alert";..else i
11e0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
11f0: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72  T_CONNECT).major
1200: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65   = "connect";..e
1210: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1220: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09  SSL_ST_ACCEPT)..
1230: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22  major = "accept"
1240: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f  ;..else.....majo
1250: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a  r = "unknown";..
1260: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
1270: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72  _CB_READ)..minor
1280: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65   = "read";..else
1290: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
12a0: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f  _CB_WRITE)..mino
12b0: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c  r = "write";..el
12c0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
12d0: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e  SL_CB_LOOP)..min
12e0: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c  or = "loop";..el
12f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1300: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e  SL_CB_EXIT)..min
1310: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c  or = "exit";..el
1320: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22  se.....minor = "
1330: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a  unknown";.    }.
1340: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
1350: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
1360: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61  ith fn, chan, ma
1370: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73  jor, minor, mess
1380: 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72  age, and type ar
1390: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
13a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
13b0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13c0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13f0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
1400: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
1410: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1430: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1440: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1450: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1460: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1470: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1480: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1490: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
14b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14c0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1500: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
1510: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1520: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1530: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1540: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1550: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1560: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1570: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1580: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1590: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
15a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
15b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15c0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15e0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15f0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
1600: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
1610: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1630: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1640: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1650: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1660: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1670: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1680: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1690: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
16a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16b0: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16d0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16e0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16f0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
1700: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
1710: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1720: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1730: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1740: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1750: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a  ----------. *. *
17a0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
17b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17c0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17d0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17f0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1800: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
1810: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1820: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
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 0a 20 2a 2f 0a  -----------. */.
1870: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1880: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1890: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
18a0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
18b0: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18c0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18d0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18e0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18f0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
1900: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
1910: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1920: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1930: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1940: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1950: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1960: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1970: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1980: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1990: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
19a0: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
19b0: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19f0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
1a00: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
1a10: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a20: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a30: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a40: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a50: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a70: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a80: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a90: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1aa0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1ab0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1ac0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ad0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ae0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1af0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1b00: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1b10: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b20: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b30: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b50: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b60: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b70: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b80: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b90: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1ba0: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1bb0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1bc0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bd0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1be0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bf0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09  .ver = "none";..
1c00: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1c10: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e  lt:..ver = "unkn
1c20: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  own";..break;.  
1c30: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
1c40: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b  (content_type) {
1c50: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1c60: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20  T_HEADER:..type 
1c70: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65  = "Header";..bre
1c80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c90: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45  3_RT_INNER_CONTE
1ca0: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d  NT_TYPE:..type =
1cb0: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20   "Inner Content 
1cc0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  Type";..break;. 
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1ce0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50  CHANGE_CIPHER_SP
1cf0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61  EC:..type = "Cha
1d00: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72  nge Cipher";..br
1d10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1d20: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79  L3_RT_ALERT:..ty
1d30: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62  pe = "Alert";..b
1d40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d50: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45  SL3_RT_HANDSHAKE
1d60: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73  :..type = "Hands
1d70: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  hake";..break;. 
1d80: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1d90: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41  APPLICATION_DATA
1da0: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44  :..type = "App D
1db0: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69  ata";..break;.#i
1dc0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
1dd0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
1de0: 30 30 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20  00000L.    case 
1df0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1e00: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1e10: 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b  rtbeat";..break;
1e20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
1e30: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e40: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e50: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e60: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e70: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e80: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e90: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1ea0: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1eb0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1ec0: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ed0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1ee0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ef0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1f00: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1f10: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1f20: 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69  , BIO_pending(bi
1f30: 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f  o) < 15000 ? BIO
1f40: 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20  _pending(bio) : 
1f50: 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c  14999);..n = (n<
1f60: 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66  0) ? 0 : n;..buf
1f70: 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f  fer[n] = 0;..(vo
1f80: 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f  id)BIO_flush(bio
1f90: 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f  );..BIO_free(bio
1fa0: 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  );.   }..    /* 
1fb0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1fc0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1fd0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c  chan, direction,
1fe0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20   version, type, 
1ff0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
2000: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
2010: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
2020: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
2030: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
2040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2050: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2060: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2070: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2080: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2090: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
20b0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
20d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
20e0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
20f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2100: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2110: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2120: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2130: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
2140: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
2150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2180: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2190: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
21a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
21b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
21c0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
21d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
21e0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
21f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2200: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2210: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2220: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
2230: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
2240: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2250: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2260: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2270: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2280: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2290: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
22a0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
22b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
22c0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
22d0: 2d 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 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
2320: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2330: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
2340: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
2350: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
2360: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2370: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2380: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2390: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
23a0: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
23b0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
23c0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
23d0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
23e0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
23f0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2400: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2410: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
2420: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
2430: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
2440: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
2450: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
2460: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
2470: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2480: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2490: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
24a0: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
24b0: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
24c0: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
24d0: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
24e0: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
24f0: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2500: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2510: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
2520: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2530: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
2540: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
2550: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
2560: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
2570: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2580: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2590: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
25a0: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
25b0: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
25c0: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
25d0: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
25e0: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
25f0: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2600: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2610: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
2620: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
2630: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
2640: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
2650: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
2660: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
2670: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2680: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2690: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
26a0: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
26b0: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
26c0: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
26d0: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
26e0: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
26f0: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2700: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2710: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
2720: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
2730: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2740: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
2750: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
2760: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2770: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2780: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2790: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
27a0: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
27b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
27c0: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
27d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
27e0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
27f0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2800: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2810: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
2820: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
2830: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
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 0a 20 2a 2f 0a 73  ----------. */.s
2880: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2890: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
28a0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
28b0: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
28c0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
28d0: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
28e0: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
28f0: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2900: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2910: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
2920: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
2930: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
2940: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2950: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
2960: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
2970: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2980: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2990: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
29a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
29b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
29c0: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
29d0: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
29e0: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
29f0: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2a00: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2a10: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
2a20: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
2a30: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
2a40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65  .    dprintf("Ve
2a50: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64  rifyCallback: %d
2a60: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20  ", ok);..    if 
2a70: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
2a80: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
2a90: 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20  L) {../* Use ok 
2aa0: 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63  value if verific
2ab0: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
2ac0: 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50  d */..if (stateP
2ad0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c  tr->vflags & SSL
2ae0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
2af0: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
2b00: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
2b10: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2b20: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20  eturn 1;..}.    
2b30: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
2b40: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d  == NULL || ssl =
2b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2b60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
2b70: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43  dprintf("VerifyC
2b80: 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61  allback: eval ca
2b90: 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f  llback");..    /
2ba0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
2bb0: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
2bc0: 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63  , chan, depth, c
2bd0: 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73  ert info list, s
2be0: 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72  tatus, and error
2bf0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
2c00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
2c10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
2c20: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
2c30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2c50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2c60: 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20  ngObj("verify", 
2c70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2c80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2ca0: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r,..Tcl_NewStrin
2cb0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
2cc0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
2cd0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
2ce0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2cf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2d10: 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29  NewIntObj(depth)
2d20: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2d30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2d40: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2d50: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
2d60: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20  nterp, cert));. 
2d70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d90: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2da0: 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a  NewIntObj(ok));.
2db0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2dc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2dd0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
2de0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
2df0: 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66  char*)X509_verif
2e00: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
2e10: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a  ing(err), -1));.
2e20: 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  .    /* Prevent 
2e30: 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61  I/O while callba
2e40: 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ck is in progres
2e50: 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74  s */.    /* stat
2e60: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
2e70: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b  LS_TCL_CALLBACK;
2e80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c   */..    /* Eval
2e90: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
2ea0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
2eb0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2ec0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c  );.    ok = Eval
2ed0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
2ee0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
2ef0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
2f00: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2f10: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2f20: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2f30: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d  command result =
2f40: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20   %d", ok);..    
2f50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2f60: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2f70: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20  CALLBACK); */.  
2f80: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20    return ok;./* 
2f90: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76  By default, leav
2fa0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75  e verification u
2fb0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c  nchanged. */.}..
2fc0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
3010: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a  Tls_Error --. *.
3020: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
3030: 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20 65  k with list of e
3040: 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64  rrors.. *. * Sid
3050: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
3060: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74  e err field of t
3070: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
3080: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20  rative State is 
3090: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74  set. *.  to a st
30a0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
30b0: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  the SSL negotiat
30c0: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73  ion failure reas
30d0: 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  on. *. *--------
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 0a 20 2a 2f 0a  -----------. */.
3120: 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53  void.Tls_Error(S
3130: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
3140: 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20  char *msg) {.   
3150: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3160: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
3170: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
3180: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69  Obj *cmdPtr, *li
3190: 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67  stPtr;.    unsig
31a0: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20  ned long err;.  
31b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
31c0: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69  = msg;..    dpri
31d0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
31e0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
31f0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
3200: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72  cl_Obj*)NULL)..r
3210: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43  eturn;..    /* C
3220: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
3230: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
3240: 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65  han, and message
3250: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
3260: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
3270: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
3280: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
3290: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
32a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
32b0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
32c0: 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72  StringObj("error
32d0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
32e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
32f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3300: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
3310: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
3320: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
3330: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
3340: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73  -1));.    if (ms
3350: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  g != NULL) {..Tc
3360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3370: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3380: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3390: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
33a0: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
33b0: 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65  f ((msg = Tcl_Ge
33c0: 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f  tString(Tcl_GetO
33d0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
33e0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) != NULL) {..T
33f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3400: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3410: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3420: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3430: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
3440: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  {..listPtr = Tcl
3450: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
3460: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65  ULL);..while ((e
3470: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72  rr = ERR_get_err
3480: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20  or()) != 0) {.. 
3490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
34a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
34b0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
34c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52  _NewStringObj(ER
34d0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
34e0: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
34f0: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ;..}..Tcl_ListOb
3500: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3510: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c  nterp, cmdPtr, l
3520: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  istPtr);.    }..
3530: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
3540: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
3550: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
3560: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
3570: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
3580: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
3590: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
35a0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
35b0: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
35c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
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 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
3610: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
3620: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
3630: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
3640: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
3650: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
3660: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
36b0: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
36c0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
36d0: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
36e0: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
36f0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
3700: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
3710: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20      FILE *fd;.. 
3720: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
3730: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
3740: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
3750: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
3760: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
3770: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
3780: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
3790: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
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 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
37e0: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
37f0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3800: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
3810: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3820: 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e  y loading/storin
3830: 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69  g a PEM. *.certi
3840: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72  ficate with encr
3850: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61  yption. Evals ca
3860: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e  llback script an
3870: 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65  d returns. *.the
3880: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70   result as the p
3890: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69  assword string i
38a0: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73  n buf.. *. * Res
38b0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
38c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
38d0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
38e0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
38f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
3900: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65   *.Password size
3910: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20   in bytes or -1 
3920: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a  for an error.. *
3930: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 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 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
3980: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61  c int.PasswordCa
3990: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66  llback(char *buf
39a0: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20  , int size, int 
39b0: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64  rwflag, void *ud
39c0: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ata) {.    State
39d0: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
39e0: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20  ate *) udata;.  
39f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3a00: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3a10: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3a20: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
3a30: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20    int code;..   
3a40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3a50: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ");..    /* If n
3a60: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20  o callback, use 
3a70: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b  default callback
3a80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
3a90: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
3aa0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54  = NULL) {..if (T
3ab0: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70  cl_EvalEx(interp
3ac0: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64  , "tls::password
3ad0: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
3ae0: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f  GLOBAL) == TCL_O
3af0: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  K) {..    char *
3b00: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3b10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3b20: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20  lt(interp);..   
3b30: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65   strncpy(buf, re
3b40: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65  t, (size_t) size
3b50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
3b60: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b  int)strlen(ret);
3b70: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
3b80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20  return -1;..}.  
3b90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
3ba0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
3bb0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66 6c  al with fn, rwfl
3bc0: 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72 67  ag, and size arg
3bd0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
3be0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
3bf0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  bj(statePtr->pas
3c00: 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f  sword);.    Tcl_
3c10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3c20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3c30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3c40: 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22  ngObj("password"
3c50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
3c60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3c70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3c80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
3c90: 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20  bj(rwflag));.   
3ca0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3cb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3cc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3cd0: 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a  wIntObj(size));.
3ce0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
3cf0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3d00: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
3d10: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3d20: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
3d30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
3d40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
3d50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
3d60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3d70: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
3d80: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
3d90: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
3da0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69  L_GLOBAL);.    i
3db0: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f  f (code != TCL_O
3dc0: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  K) {.#if (TCL_MA
3dd0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
3de0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
3df0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
3e00: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
3e10: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
3e20: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3e30: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
3e40: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
3e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
3e60: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3e70: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c  r);..    Tcl_Rel
3e80: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
3e90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
3ea0: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66    /* If successf
3eb0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61  ul, pass back pa
3ec0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e  ssword string an
3ed0: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f  d truncate if to
3ee0: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66  o long */.    if
3ef0: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b   (code == TCL_OK
3f00: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65  ) {..Tcl_Size le
3f10: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20  n;..char *ret = 
3f20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3f30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3f40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3f50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3f60: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53  if (len > (Tcl_S
3f70: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09  ize) size-1) {..
3f80: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53      len = (Tcl_S
3f90: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a  ize) size-1;..}.
3fa0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
3fb0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  t, (size_t) len)
3fc0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c  ;..buf[len] = '\
3fd0: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  0';..Tcl_Release
3fe0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3ff0: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28  terp);..return (
4000: 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  int) len;.    }.
4010: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
4020: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
4030: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  erp);.    return
4040: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d   -1;.}.../*. *--
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20  -. *. * Session 
40a0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
40b0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  ents --. *. *.Ca
40c0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
40d0: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64  session is added
40e0: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49   to the cache. I
40f0: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69  n TLS 1.3. *.thi
4100: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65  s may be receive
4110: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
4120: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73   after the hands
4130: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72  hake. For. *.ear
4140: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74  lier versions, t
4150: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65  his will be rece
4160: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  ived during the 
4170: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68  handshake.. *.Th
4180: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72  is is the prefer
4190: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69  red way to obtai
41a0: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65  n a resumable se
41b0: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ssion.. *. * Res
41c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
41d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
41e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
41f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4200: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4210: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f  des:. *.0 = erro
4220: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20  r where session 
4230: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74  will be immediat
4240: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  ely removed from
4250: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
4260: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63  che.. *.1 = succ
4270: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65  ess where app re
4280: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e  tains session in
4290: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20   session cache, 
42a0: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53  and must call SS
42b0: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29  L_SESSION_free()
42c0: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20   when done.. *. 
42d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4320: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62  int.SessionCallb
4330: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53  ack(SSL *ssl, SS
4340: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69  L_SESSION *sessi
4350: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  on) {.    State 
4360: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
4370: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
4380: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29  data((SSL *)ssl)
4390: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
43a0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
43b0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
43c0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
43d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
43e0: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
43f0: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  t;.    const uns
4400: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
4410: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65  ion_id;.    size
4420: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73  _t len2;.    uns
4430: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a  igned int ulen;.
4440: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4450: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4460: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4470: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
4480: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
4490: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
44a0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  OK;.    } else i
44b0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
44c0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
44d0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
44e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
44f0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
4500: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
4510: 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20  an, session id, 
4520: 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20  session ticket, 
4530: 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67  and lifetime arg
4540: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
4550: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
4560: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
4570: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
45b0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c  ngObj("session",
45c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
45d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
45e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
45f0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
4600: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
4610: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
4620: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
4630: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
4640: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65  ion id */.    se
4650: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
4660: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
4670: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20  ssion, &ulen);. 
4680: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4690: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
46a0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
46b0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
46c0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
46d0: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a  _Size) ulen));..
46e0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74      /* Session t
46f0: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  icket */.    SSL
4700: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
4710: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74  cket(session, &t
4720: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20  icket, &len2);. 
4730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4750: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4760: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
4770: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
4780: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20  e) len2));..    
4790: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75  /* Lifetime - nu
47a0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
47b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
47c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
47d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
47e0: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28  .Tcl_NewLongObj(
47f0: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49  (long) SSL_SESSI
4800: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
4810: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
4820: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ion)));..    /* 
4830: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
4840: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
4850: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
4860: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
4870: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
4880: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
4890: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
48a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
48b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
48c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4910: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20  * ALPN Callback 
4920: 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20  for Servers and 
4930: 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  NPN Callback for
4940: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20   Clients --. *. 
4950: 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63  *.Perform protoc
4960: 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32  ol (http/1.1, h2
4970: 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65  , h3, etc.) sele
4980: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a  ction for the. *
4990: 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63  .incoming connec
49a0: 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74  tion. Called aft
49b0: 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72  er Hello and ser
49c0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ver callbacks.. 
49d0: 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73  *.Where 'out' is
49e0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
49f0: 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74  ol and 'in' is t
4a00: 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73  he peer advertis
4a10: 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52  ed list.. *. * R
4a20: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
4a30: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4a40: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
4a50: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4a60: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4a70: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
4a80: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50  SEXT_ERR_OK: ALP
4a90: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  N protocol selec
4aa0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
4ab0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
4ac0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4ad0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68  _ALERT_FATAL: Th
4ae0: 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c  ere was no overl
4af0: 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  ap between the c
4b00: 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73  lient's. *.    s
4b10: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64  upplied list and
4b20: 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66   the server conf
4b30: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63  iguration. The c
4b40: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62  onnection will b
4b50: 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53  e aborted.. *.SS
4b60: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
4b70: 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  CK: ALPN protoco
4b80: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20  l not selected, 
4b90: 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f  e.g., because no
4ba0: 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f   ALPN. *.    pro
4bb0: 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69  tocols are confi
4bc0: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63  gured for this c
4bd0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63  onnection. The c
4be0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
4bf0: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50  /.static int.ALP
4c50: 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73  NCallback(SSL *s
4c60: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
4c70: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
4c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
4c90: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73  tlen,..const uns
4ca0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20  igned char *in, 
4cb0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c  unsigned int inl
4cc0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
4cd0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
4ce0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
4cf0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
4d00: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
4d10: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
4d20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
4d30: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
4d40: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69  , res;..    dpri
4d50: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
4d60: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
4d70: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55  ULL || arg == NU
4d80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
4d90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
4da0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
4db0: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f  * Select protoco
4dc0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c  l */.    if (SSL
4dd0: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f  _select_next_pro
4de0: 74 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  to((unsigned cha
4df0: 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65  r **) out, outle
4e00: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  n, statePtr->pro
4e10: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  tos, statePtr->p
4e20: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20  rotos_len,..in, 
4e30: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53  inlen) == OPENSS
4e40: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44  L_NPN_NEGOTIATED
4e50: 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f  ) {../* Match fo
4e60: 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53  und */..res = SS
4e70: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
4e80: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
4e90: 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f  * OPENSSL_NPN_NO
4ea0: 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76  _OVERLAP = No ov
4eb0: 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69  erlap, so use fi
4ec0: 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c  rst item from cl
4ed0: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69  ient protocol li
4ee0: 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c  st */..res = SSL
4ef0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4f00: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
4f10: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
4f20: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
4f30: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65  LL) {..return re
4f40: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  s;.    }..    /*
4f50: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
4f60: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
4f70: 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65   chan, depth, ce
4f80: 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74  rt info list, st
4f90: 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20  atus, and error 
4fa0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
4fb0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
4fc0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
4fd0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
4fe0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4ff0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5000: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5010: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
5020: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5030: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5040: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
5050: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
5060: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
5070: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
5080: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
5090: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
50a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
50b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
50c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
50d0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75  onst char *) *ou
50e0: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  t, -1));.    Tcl
50f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5100: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5110: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  dPtr, Tcl_NewBoo
5120: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53  leanObj(res == S
5130: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5140: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
5150: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
5160: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
5170: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
5180: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
5190: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
51a0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
51b0: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
51c0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
51d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
51e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
51f0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
5200: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5210: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
5220: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5230: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
5240: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  TAL;.    }.    T
5250: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5260: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
5270: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
5280: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65  -----. *. * Adve
52d0: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20  rtise Protocols 
52e0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78  Callback for Nex
52f0: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  t Protocol Negot
5300: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20  iation (NPN) in 
5310: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20  ServerHello --. 
5320: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e  *. *.called when
5330: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65   a TLS server ne
5340: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75  eds a list of su
5350: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c  pported protocol
5360: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72  s for Next. *.Pr
5370: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
5380: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
5390: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
53a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
53b0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
53c0: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
53d0: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f  _ERR_OK: NPN pro
53e0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20  tocol selected. 
53f0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5400: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
5410: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5420: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  K: NPN protocol 
5430: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68  not selected. Th
5440: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5450: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  . */.#ifdef USE_
54b0: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e  NPN.static int.N
54c0: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  PNCallback(const
54d0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
54e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
54f0: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69  *out, unsigned i
5500: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64  nt *outlen, void
5510: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
5520: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
5530: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20  State*)arg;..   
5540: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
5550: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
5560: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
5570: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
5580: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5590: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
55a0: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f      /* Set proto
55b0: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20  cols list */.   
55c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
55d0: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
55e0: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74  ..*out = statePt
55f0: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74  r->protos;..*out
5600: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  len = statePtr->
5610: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20  protos_len;.    
5620: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d  } else {..*out =
5630: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20   NULL;..*outlen 
5640: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  = 0;..return SSL
5650: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5660: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
5670: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5680: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RR_OK;.}.#endif.
5690: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
56e0: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f   SNI Callback fo
56f0: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a  r Servers --. *.
5700: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65   *.Perform serve
5710: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e  r-side SNI hostn
5720: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66  ame selection af
5730: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e  ter receiving SN
5740: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69  I extension. *.i
5750: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20  n Client Hello. 
5760: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c  Called after hel
5770: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20  lo callback but 
5780: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c  before ALPN call
5790: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  back.. *. * Resu
57a0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
57b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
57c0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
57d0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
57e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
57f0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
5800: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f  T_ERR_OK: SNI ho
5810: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74  stname is accept
5820: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5830: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5840: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
5850: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49  ALERT_FATAL: SNI
5860: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5870: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
5880: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20  onnection. *.   
5890: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66   is aborted. Def
58a0: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69  ault for alert i
58b0: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  s SSL_AD_UNRECOG
58c0: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53  NIZED_NAME.. *.S
58d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
58e0: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49  ERT_WARNING: SNI
58f0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5900: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69   accepted, warni
5910: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20  ng alert. *.    
5920: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72  sent (not suppor
5930: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e  ted in TLSv1.3).
5940: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5950: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5960: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5970: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  CK: SNI hostname
5980: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5990: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c   and not acknowl
59a0: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e  edged,. *.    e.
59b0: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f  g. if SNI has no
59c0: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  t been configure
59d0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
59e0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
59f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a30: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
5a40: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b   int.SNICallback
5a50: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
5a60: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
5a70: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
5a80: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
5a90: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
5aa0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5ab0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
5ac0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
5ad0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
5ae0: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
5af0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5b00: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c  servername = NUL
5b10: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  L;..    dprintf(
5b20: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5b30: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5b40: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5b50: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5b60: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5b70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
5b80: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53  ly works for TLS
5b90: 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72   1.2 and earlier
5ba0: 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61   */.    serverna
5bb0: 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72  me = SSL_get_ser
5bc0: 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
5bd0: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
5be0: 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20  t_name);.    if 
5bf0: 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20  (!servername || 
5c00: 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d  servername[0] ==
5c10: 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e   '\0') {..return
5c20: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5c30: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5c40: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5c50: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
5c60: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
5c70: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5c80: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
5c90: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
5ca0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
5cb0: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72  n, chan, and ser
5cc0: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f  ver name args */
5cd0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
5ce0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
5cf0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
5d00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5d10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5d20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5d30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
5d40: 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ni", -1));.    T
5d50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5d60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5d70: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
5d80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
5d90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
5da0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
5db0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5dc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5dd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5de0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5df0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
5e00: 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a   , -1));..    /*
5e10: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
5e20: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
5e30: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
5e40: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  mdPtr);.    if (
5e50: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c  (code = EvalCall
5e60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
5e70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20  tePtr, cmdPtr)) 
5e80: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  > 1) {..res = SS
5e90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5ea0: 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c  RT_WARNING;..*al
5eb0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
5ec0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
5ed0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
5ee0: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
5ef0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
5f00: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
5f10: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5f20: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
5f30: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5f40: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
5f50: 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TAL;..*alert = S
5f60: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
5f70: 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20  ED_NAME; /* Not 
5f80: 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53  supported by TLS
5f90: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   1.3 */.    }.  
5fa0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5fb0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
5fc0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
5fd0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6010: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
6020: 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73  lientHello Hands
6030: 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f  hake Callback fo
6040: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a  r Servers --. *.
6050: 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65   *.Used by serve
6060: 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65  r to examine the
6070: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64   server name ind
6080: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78  ication (SNI) ex
6090: 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69  tension. *.provi
60a0: 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e  ded by the clien
60b0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  t in order to se
60c0: 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69  lect an appropri
60d0: 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20  ate certificate 
60e0: 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61  to. *.present, a
60f0: 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f  nd make other co
6100: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75  nfiguration adju
6110: 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74  stments relevant
6120: 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a   to that server.
6130: 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20   *.name and its 
6140: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
6150: 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61  his includes swa
6160: 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73  pping out the as
6170: 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f  sociated. *.SSL_
6180: 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64  CTX pointer, mod
6190: 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65  ifying the serve
61a0: 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d  r's list of perm
61b0: 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f  itted TLS versio
61c0: 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20  ns,. *.changing 
61d0: 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70  the server's cip
61e0: 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70  her list in resp
61f0: 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65  onse to the clie
6200: 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  nt's cipher list
6210: 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64  , etc.. *.Called
6220: 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20   before SNI and 
6230: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  ALPN callbacks..
6240: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
6250: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
6260: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
6270: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
6280: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
6290: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
62a0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
62b0: 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64  O_RETRY: suspend
62c0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20   the handshake, 
62d0: 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b  and the handshak
62e0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  e function will 
62f0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
6300: 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  ly. *.SSL_CLIENT
6310: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61  _HELLO_ERROR: fa
6320: 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65  ilure, terminate
6330: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74   connection. Set
6340: 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20   alert to error 
6350: 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49  code.. *.SSL_CLI
6360: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53  ENT_HELLO_SUCCES
6370: 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a  S: success. *. *
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
63d0: 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b  nt.HelloCallback
63e0: 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a  (SSL *ssl, int *
63f0: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67  alert, void *arg
6400: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
6410: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
6420: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
6430: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
6440: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
6450: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
6460: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
6470: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f  ode, res;.    co
6480: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72  nst char *server
6490: 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  name;.    const 
64a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
64b0: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ;.    size_t len
64c0: 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20  , remaining;..  
64d0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
64e0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
64f0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
6500: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
6510: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
6520: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
6530: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  SS;.    } else i
6540: 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74  f (ssl == (const
6550: 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61   SSL *)NULL || a
6560: 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55  rg == (void *)NU
6570: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
6580: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6590: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
65a0: 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f   /* Get names */
65b0: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c  .    if (!SSL_cl
65c0: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f  ient_hello_get0_
65d0: 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ext(ssl, TLSEXT_
65e0: 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65  TYPE_server_name
65f0: 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67  , &p, &remaining
6600: 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c  ) || remaining <
6610: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
6620: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45   SSL_R_SSLV3_ALE
6630: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d  RT_ILLEGAL_PARAM
6640: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  ETER;..return SS
6650: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6660: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6670: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
6680: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75  length of the su
6690: 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e  pplied list of n
66a0: 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e  ames. */.    len
66b0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
66c0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
66d0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
66e0: 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e   + 2 != remainin
66f0: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  g) {..*alert = S
6700: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
6710: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
6720: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
6730: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6740: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
6750: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a  maining = len;..
6760: 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
6770: 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79  in practice only
6780: 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c   has a single el
6790: 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c  ement, so we onl
67a0: 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  y consider the f
67b0: 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20  irst one. */.   
67c0: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d   if (remaining =
67d0: 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54  = 0 || *p++ != T
67e0: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
67f0: 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c  ost_name) {..*al
6800: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6810: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6820: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6830: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6850: 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a    remaining--;..
6860: 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61      /* Now we ca
6870: 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f  n finally pull o
6880: 75 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61  ut the byte arra
6890: 79 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61  y with the actua
68a0: 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20  l hostname. */. 
68b0: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67     if (remaining
68c0: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74   <= 2) {..*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 6c  ROR;.    }.    l
6920: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20  en = (*(p++) << 
6930: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a  8);.    len += *
6940: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c  (p++);.    if (l
6950: 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69  en + 2 > remaini
6960: 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20  ng) {..*alert = 
6970: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6980: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6990: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
69a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
69c0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20  ining = len;.   
69d0: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63   servername = (c
69e0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a  onst char *)p;..
69f0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
6a00: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
6a10: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64  th fn, chan, and
6a20: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67   server name arg
6a30: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
6a40: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
6a50: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
6a60: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
6a70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6a80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
6a90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6aa0: 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b  j("hello", -1));
6ab0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6ac0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6ad0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
6ae0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
6af0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
6b00: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
6b10: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
6b20: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6b30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6b40: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
6b50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76  ewStringObj(serv
6b60: 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a  ername, (Tcl_Siz
6b70: 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f  e) len));..    /
6b80: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
6b90: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
6ba0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
6bb0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
6bc0: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
6bd0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
6be0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
6bf0: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
6c00: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6c10: 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d  RETRY;..*alert =
6c20: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6c30: 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45  RT_USER_CANCELLE
6c40: 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  D;.    } else if
6c50: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09   (code == 1) {..
6c60: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6c70: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
6c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
6c90: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6ca0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c  ELLO_ERROR;..*al
6cb0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6cc0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6ce0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6cf0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
6d00: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
6d10: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6d20: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e  *****/./* Comman
6d30: 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a  ds         */./*
6d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d50: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6da0: 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43  *. * CiphersObjC
6db0: 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c  md -- list avail
6dc0: 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a  able ciphers. *.
6dd0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
6de0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
6df0: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73  process the "tls
6e00: 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61  ::ciphers" comma
6e10: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76  nd. *.to list av
6e20: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c  ailable ciphers,
6e30: 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74   based upon prot
6e40: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20  ocol selected.. 
6e50: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6e60: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
6e70: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a  result list.. *.
6e80: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6e90: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61  . *.constructs a
6ea0: 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20  nd destroys SSL 
6eb0: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a  context (CTX). *
6ec0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
6f10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72  c const char *pr
6f20: 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22  otocols[] = {.."
6f30: 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22  ssl2", "ssl3", "
6f40: 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c  tls1", "tls1.1",
6f50: 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31   "tls1.2", "tls1
6f60: 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75  .3", NULL.};.enu
6f70: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20  m protocol {.   
6f80: 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53   TLS_SSL2, TLS_S
6f90: 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54  SL3, TLS_TLS1, T
6fa0: 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54  LS_TLS1_1, TLS_T
6fb0: 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_2, TLS_TLS1_
6fc0: 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a  3, TLS_NONE.};..
6fd0: 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65  static int.Ciphe
6fe0: 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rsObjCmd(ClientD
6ff0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
7000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7010: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
7020: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
7030: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
7040: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c  bj *objPtr = NUL
7050: 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  L;.    SSL_CTX *
7060: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
7070: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b  SSL *ssl = NULL;
7080: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53  .    STACK_OF(SS
7090: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20  L_CIPHER) *sk;. 
70a0: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66     char *cp, buf
70b0: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e  [BUFSIZ];.    in
70c0: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65  t index, verbose
70d0: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72   = 0, use_suppor
70e0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ted = 0;.    con
70f0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
7100: 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f 69 64  ethod;.    (void
7110: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
7120: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7130: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28  ed");..    if ((
7140: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62  objc < 2) || (ob
7150: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f  jc > 4)) {..Tcl_
7160: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7170: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70  erp, 1, objv, "p
7180: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65  rotocol ?verbose
7190: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b  ? ?supported?");
71a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
71b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
71c0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
71d0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
71e0: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73  jv[1], protocols
71f0: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c  , "protocol", 0,
7200: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f   &index) != TCL_
7210: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7230: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32     if ((objc > 2
7240: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7250: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7260: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72  p, objv[2], &ver
7270: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  bose) != TCL_OK)
7280: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
7290: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
72a0: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26  if ((objc > 3) &
72b0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
72c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
72d0: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75  objv[3], &use_su
72e0: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f  pported) != TCL_
72f0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7300: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7310: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
7320: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74  ror();..    swit
7330: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63  ch ((enum protoc
7340: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73  ol)index) {..cas
7350: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20  e TLS_SSL2:.#if 
7360: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
7370: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
7380: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
7390: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
73a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
73b0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41  SSL2)..    Tcl_A
73c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
73d0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
73e0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
73f0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
7400: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
7410: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7420: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7430: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c      method = SSL
7440: 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  v2_method(); bre
7450: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7460: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64   TLS_SSL3:.#if d
7470: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
7480: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7490: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  SL_NO_SSL3) || d
74a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
74b0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09  O_SSL3_METHOD)..
74c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
74d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
74e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
74f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7500: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7510: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
7520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7530: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7540: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68  hod = SSLv3_meth
7550: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7560: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
7570: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
7580: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
7590: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
75a0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
75b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
75c0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
75d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
75e0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
75f0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7600: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7610: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
7620: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
7630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7640: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54  ..    method = T
7650: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62  LSv1_method(); b
7660: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7670: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23  se TLS_TLS1_1:.#
7680: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7690: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
76a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
76b0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
76c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
76d0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
76e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
76f0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
7700: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7710: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7720: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
7730: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7740: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7750: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7760: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29  TLSv1_1_method()
7770: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
7780: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32  .case TLS_TLS1_2
7790: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
77a0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
77b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
77c0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
77d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
77e0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  1_2_METHOD)..   
77f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7800: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7810: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7820: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7830: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7840: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7860: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7870: 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f   = TLSv1_2_metho
7880: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7890: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
78a0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_3:.#if defined
78b0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
78c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
78d0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54  O_TLS1_3)..    T
78e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
78f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7900: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7910: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7920: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
7930: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7940: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7950: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7960: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7970: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7980: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
7990: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
79a0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c  RSION);..    SSL
79b0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
79c0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
79d0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
79e0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e  ..    break;.#en
79f0: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  dif..default:.. 
7a00: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f     method = TLS_
7a10: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62  method();..    b
7a20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7a30: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
7a40: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20  ew(method);.    
7a50: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29  if (ctx == NULL)
7a60: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7a70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54  sult(interp, GET
7a80: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
7a90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
7aa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7ab0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c  ;.    }..    ssl
7ac0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b   = SSL_new(ctx);
7ad0: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
7ae0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7af0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7b00: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7b10: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
7b20: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
7b30: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
7b40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7b50: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73  ..    /* Use lis
7b60: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77  t and order as w
7b70: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20  ould be sent in 
7b80: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72  a ClientHello or
7b90: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63   all available c
7ba0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66  iphers */.    if
7bb0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
7bc0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
7bd0: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68  1_supported_ciph
7be0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20  ers(ssl);.    } 
7bf0: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c  else {..sk = SSL
7c00: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c  _get_ciphers(ssl
7c10: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
7c20: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a   (sk != NULL) {.
7c30: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b  .if (!verbose) {
7c40: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
7c50: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
7c60: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72   NULL);..    for
7c70: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
7c80: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e   sk_SSL_CIPHER_n
7c90: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09  um(sk); i++) {..
7ca0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45  .const SSL_CIPHE
7cb0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49  R *c = sk_SSL_CI
7cc0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69  PHER_value(sk, i
7cd0: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55  );...if (c == NU
7ce0: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09  LL) continue;...
7cf0: 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20  ./* cipher name 
7d00: 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63  or (NONE) */...c
7d10: 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  p = SSL_CIPHER_g
7d20: 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66  et_name(c);...if
7d30: 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72   (cp == NULL) br
7d40: 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  eak;...Tcl_ListO
7d50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7d60: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
7d70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7d80: 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  (cp, -1));..    
7d90: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7da0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7db0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7dc0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7dd0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7de0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7df0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7e00: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7e10: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7e20: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7e30: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7e40: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7e50: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7e60: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7e70: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7e80: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7e90: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7ea0: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7eb0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7ec0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7ed0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7ee0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7ef0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7f00: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7f10: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7f20: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
7f30: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
7f40: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
7f50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
7f60: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
7f70: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
7f80: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
7f90: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
7fa0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
7fb0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
7fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7fd0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
8030: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8040: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8050: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8060: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8070: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8080: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8090: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
80a0: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
80b0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
80c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
80d0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
80e0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
80f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8100: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8160: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8170: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8180: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8190: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
81a0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
81b0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
81c0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
81d0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
81e0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
81f0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
8200: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
8210: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
8220: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8230: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
8240: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8250: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8260: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8270: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
8280: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
8290: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
82a0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
82b0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
82c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
82d0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
82e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
82f0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
8300: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8310: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8320: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8330: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8340: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
8350: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8360: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8370: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8380: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
8390: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
83a0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
83b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
83c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
83d0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
83e0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
83f0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29  [TLS_SSL3], -1))
8400: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8410: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
8420: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8430: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8450: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8480: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8490: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
84a0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
84b0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
84c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
84d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
84e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
84f0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
8500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8510: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
8520: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8530: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8540: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8550: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8560: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8570: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8580: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8590: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
85a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85b0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
85c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
85d0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
85e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
85f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8600: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8610: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8620: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
8630: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8640: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8650: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8660: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8670: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8680: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8690: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
86a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
86b0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
86c0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
86d0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
86e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
86f0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
8700: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8710: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8760: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8770: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8780: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8790: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
87a0: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
87b0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
87c0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
87d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
87e0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
87f0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
8800: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
8810: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
8820: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8830: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8840: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8850: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8860: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
88b0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
88c0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
88d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
88e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
88f0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
8900: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8910: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
8920: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
8930: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
8940: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
8950: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
8960: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
8970: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
8980: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
8990: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
89a0: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
89b0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
89c0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
89d0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
89e0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
89f0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8a00: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
8a10: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8a20: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8a30: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8a40: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
8a50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8a60: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8a70: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8a80: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8a90: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8aa0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8ab0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
8ac0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8ad0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8ae0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8af0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8b00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8b10: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8b20: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8b30: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8b40: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8b50: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8b60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8b70: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8b80: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8b90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8ba0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8bb0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8bc0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8bd0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8be0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8bf0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8c00: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8c10: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8c20: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8c30: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
8c40: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
8c50: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
8c60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8c70: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
8c80: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
8c90: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
8ca0: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
8cb0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
8cc0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8cd0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
8ce0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8cf0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
8d00: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
8d10: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
8d20: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
8d30: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
8d40: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
8d50: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
8d60: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
8d70: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
8d80: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
8d90: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
8da0: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
8db0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
8dc0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
8dd0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
8de0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
8df0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8e00: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8e10: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8e20: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8e30: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8e40: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8e50: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8e60: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8e70: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8e80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8e90: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8ea0: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8eb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8ec0: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
8ed0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
8ee0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
8ef0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
8f00: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
8f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8f20: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
8f30: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
8f40: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
8f50: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
8f60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
8f70: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8f80: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8f90: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8fa0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
8fb0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
8fc0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
8fd0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
8fe0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
8ff0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
9000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9010: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
9020: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
9030: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
9040: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
9050: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
9060: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
9070: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
9080: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
9090: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
90a0: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
90b0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
90c0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
90d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
90e0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
90f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9100: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
9160: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
9170: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9180: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
9190: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
91a0: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
91b0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
91c0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
91d0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
91e0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
91f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
9200: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
9210: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
9220: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
9230: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
9240: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
9250: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
92a0: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
92b0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
92c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
92d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
92e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
92f0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9300: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
9310: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
9320: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
9330: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9340: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
9350: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
9360: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
9370: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
9380: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
9390: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
93a0: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
93b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
93c0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
93d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
93e0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
93f0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
9400: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
9410: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
9420: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
9430: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9440: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9450: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
9460: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
9470: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
9480: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
9490: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
94a0: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
94b0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
94c0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
94d0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
94e0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
94f0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
9500: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
9510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
9520: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9530: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9540: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
9550: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
9560: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9570: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
9580: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9590: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
95a0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
95b0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
95c0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
95d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
95e0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
95f0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
9600: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ams..= NULL;.   
9610: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d   char *model...=
9620: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9630: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
9640: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
9650: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
9660: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
9670: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
9680: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
9690: 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  id = NULL;.    T
96a0: 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20  cl_Obj *alpn..= 
96b0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73  NULL;.    int ss
96c0: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30  l2 = 0, ssl3 = 0
96d0: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d  ;.    int tls1 =
96e0: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20   1, tls1_1 = 1, 
96f0: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31  tls1_2 = 1, tls1
9700: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  _3 = 1;.    int 
9710: 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c  proto = 0, level
9720: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76   = -1;.    int v
9730: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69  erify = 0, requi
9740: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20  re = 0, request 
9750: 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68  = 1, post_handsh
9760: 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f  ake = 0;.    (vo
9770: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
9780: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
9790: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66  lled");..#if def
97a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
97b0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
97c0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c  _NO_TLS1).    tl
97d0: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  s1 = 0;.#endif.#
97e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
97f0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
9800: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9810: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d  _1).    tls1_1 =
9820: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9830: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
9840: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9850: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
9860: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a      tls1_2 = 0;.
9870: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
9890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
98a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
98b0: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64  tls1_3 = 0;.#end
98c0: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  if..    if (objc
98d0: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
98e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
98f0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
9900: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b  nel ?options?");
9910: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9920: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
9930: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
9940: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  ;..    chan = Tc
9950: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
9960: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
9970: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
9980: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
9990: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
99a0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
99b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
99c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
99d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
99e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
99f0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
9a00: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
9a10: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20  hannel(chan);.. 
9a20: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b     for (idx = 2;
9a30: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78   idx < objc; idx
9a40: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74  ++) {..char *opt
9a50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9a60: 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69  (objv[idx]);...i
9a70: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
9a80: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  )..    break;...
9a90: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20  OPTOBJ("-alpn", 
9aa0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  alpn);..OPTSTR("
9ab0: 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68 29  -cadir", CApath)
9ac0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69  ;..OPTSTR("-cafi
9ad0: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f  le", CAfile);..O
9ae0: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20  PTBYTE("-cert", 
9af0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b  cert, cert_len);
9b00: 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66  ..OPTSTR("-certf
9b10: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b  ile", certfile);
9b20: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
9b30: 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  r", ciphers);..O
9b40: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22  PTSTR("-ciphers"
9b50: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54  , ciphers);..OPT
9b60: 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74  STR("-ciphersuit
9b70: 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65  es", ciphersuite
9b80: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f  s);..OPTOBJ("-co
9b90: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b  mmand", script);
9ba0: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72  ..OPTSTR("-dhpar
9bb0: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b  ams", DHparams);
9bc0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22  ..OPTBYTE("-key"
9bd0: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b  , key, key_len);
9be0: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69  ..OPTSTR("-keyfi
9bf0: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09  le", keyfile);..
9c00: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c  OPTSTR("-model",
9c10: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a   model);..OPTOBJ
9c20: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61  ("-password", pa
9c30: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f  ssword);..OPTBOO
9c40: 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  L("-post_handsha
9c50: 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68  ke", post_handsh
9c60: 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ake);..OPTBOOL("
9c70: 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65  -request", reque
9c80: 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  st);..OPTBOOL("-
9c90: 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72  require", requir
9ca0: 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65  e);..OPTINT("-se
9cb0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c  curity_level", l
9cc0: 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  evel);..OPTBOOL(
9cd0: 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65  "-server", serve
9ce0: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65  r);..OPTSTR("-se
9cf0: 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65  rvername", serve
9d00: 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28  rname);..OPTSTR(
9d10: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73  "-session_id", s
9d20: 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54  ession_id);..OPT
9d30: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73  BOOL("-ssl2", ss
9d40: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l2);..OPTBOOL("-
9d50: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f  ssl3", ssl3);..O
9d60: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20  PTBOOL("-tls1", 
9d70: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  tls1);..OPTBOOL(
9d80: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f  "-tls1.1", tls1_
9d90: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  1);..OPTBOOL("-t
9da0: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b  ls1.2", tls1_2);
9db0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9dc0: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f  .3", tls1_3);..O
9dd0: 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65  PTOBJ("-validate
9de0: 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b  command", vcmd);
9df0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22  ..OPTOBJ("-vcmd"
9e00: 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41  , vcmd);...OPTBA
9e10: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c  D("option", "-al
9e20: 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66  pn, -cadir, -caf
9e30: 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72  ile, -cert, -cer
9e40: 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20  tfile, -cipher, 
9e50: 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d  -ciphersuites, -
9e60: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61  command, -dhpara
9e70: 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69  ms, -key, -keyfi
9e80: 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73  le, -model, -pas
9e90: 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e  sword, -post_han
9ea0: 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74  dshake, -request
9eb0: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63  , -require, -sec
9ec0: 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65  urity_level, -se
9ed0: 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d  rver, -servernam
9ee0: 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20  e, -session_id, 
9ef0: 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74  -ssl2, -ssl3, -t
9f00: 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74  ls1, -tls1.1, -t
9f10: 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20  ls1.2, -tls1.3, 
9f20: 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d  or -validatecomm
9f30: 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20  and");...return 
9f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9f50: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
9f60: 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  )..verify |= SSL
9f70: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
9f80: 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59  NCE | SSL_VERIFY
9f90: 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72  _PEER;.    if (r
9fa0: 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72  equest && requir
9fb0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
9fc0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
9fd0: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20  NO_PEER_CERT;.  
9fe0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
9ff0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
a000: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
a010: 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53  ERIFY_POST_HANDS
a020: 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65  HAKE;.    if (ve
a030: 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69  rify == 0)..veri
a040: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  fy = SSL_VERIFY_
a050: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f  NONE;..    proto
a060: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f   |= (ssl2 ? TLS_
a070: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b  PROTO_SSL2 : 0);
a080: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73  .    proto |= (s
a090: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  sl3 ? TLS_PROTO_
a0a0: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70  SSL3 : 0);.    p
a0b0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20  roto |= (tls1 ? 
a0c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a  TLS_PROTO_TLS1 :
a0d0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
a0e0: 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f  = (tls1_1 ? TLS_
a0f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30  PROTO_TLS1_1 : 0
a100: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a110: 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52  (tls1_2 ? TLS_PR
a120: 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b  OTO_TLS1_2 : 0);
a130: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
a140: 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_3 ? TLS_PROT
a150: 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a  O_TLS1_3 : 0);..
a160: 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20      /* reset to 
a170: 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74  NULL if blank st
a180: 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f  ring provided */
a190: 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26  .    if (cert &&
a1a0: 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20   !*cert)..      
a1b0: 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d    cert.        =
a1c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b   NULL;.    if (k
a1d0: 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20  ey && !*key)..  
a1e0: 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20        key.      
a1f0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a200: 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a   (certfile && !*
a210: 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20  certfile)       
a220: 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c    certfile.= NUL
a230: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69  L;.    if (keyfi
a240: 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29  le && !*keyfile)
a250: 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20  ..keyfile.      
a260: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a270: 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63   (ciphers && !*c
a280: 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20  iphers).        
a290: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
a2a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a2b0: 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20  ciphersuites && 
a2c0: 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20  !*ciphersuites) 
a2d0: 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20  ciphersuites    
a2e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a2f0: 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69  CAfile && !*CAfi
a300: 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69  le).        CAfi
a310: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
a320: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70 61 74  L;.    if (CApat
a330: 68 20 26 26 20 21 2a 43 41 70 61 74 68 29 09 20  h && !*CApath). 
a340: 20 20 20 20 20 20 20 43 41 70 61 74 68 09 20 20         CApath.  
a350: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a360: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26    if (DHparams &
a370: 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20  & !*DHparams).  
a380: 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20        DHparams  
a390: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20        = NULL;.. 
a3a0: 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74     /* new SSL st
a3b0: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ate */.    state
a3c0: 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29  Ptr..= (State *)
a3d0: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e   ckalloc((unsign
a3e0: 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65  ed) sizeof(State
a3f0: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73  ));.    memset(s
a400: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65  tatePtr, 0, size
a410: 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20  of(State));..   
a420: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
a430: 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74  .= flags;.    st
a440: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d  atePtr->interp.=
a450: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61   interp;.    sta
a460: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20  tePtr->vflags.= 
a470: 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74  verify;.    stat
a480: 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a  ePtr->err.= "";.
a490: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a4a0: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69   script */.    i
a4b0: 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76  f (script) {..(v
a4c0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
a4d0: 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74  ngFromObj(script
a4e0: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
a4f0: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  n) {..    stateP
a500: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73  tr->callback = s
a510: 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f  cript;..    Tcl_
a520: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a530: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
a540: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a550: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73  /* allocate pass
a560: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  word */.    if (
a570: 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f  password) {..(vo
a580: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a590: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72  gFromObj(passwor
a5a0: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c  d, &len);..if (l
a5b0: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65  en) {..    state
a5c0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20  Ptr->password = 
a5d0: 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54  password;..    T
a5e0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a5f0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
a600: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  rd);..}.    }.. 
a610: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76     /* allocate v
a620: 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20  alidate command 
a630: 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29  */.    if (vcmd)
a640: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
a650: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a660: 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  vcmd, &len);..if
a670: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
a680: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76  atePtr->vcmd = v
a690: 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  cmd;..    Tcl_In
a6a0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a6b0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20  Ptr->vcmd);..}. 
a6c0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f     }..    if (mo
a6d0: 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  del != NULL) {..
a6e0: 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65  int mode;../* Ge
a6f0: 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f  t the "model" co
a700: 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d  ntext */..chan =
a710: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
a720: 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26  interp, model, &
a730: 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e  mode);..if (chan
a740: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
a750: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54  ) NULL) {..    T
a760: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a770: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a780: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a790: 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d  R;..}.../*.. * M
a7a0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
a7b0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
a7c0: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a  st channel.. */.
a7d0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54  .chan = Tcl_GetT
a7e0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
a7f0: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61  ..if (Tcl_GetCha
a800: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
a810: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
a820: 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  e()) {..    Tcl_
a830: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a840: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
a850: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
a860: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
a870: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
a880: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61  S channel", (cha
a890: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a8a0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
a8b0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
a8c0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e   "IMPORT", "CHAN
a8d0: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
a8e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a8f0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
a900: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
a910: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
a920: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74  CL_ERROR;..}..ct
a930: 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63  x = ((State *)Tc
a940: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
a950: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d  anceData(chan))-
a960: 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65  >ctx;.    } else
a970: 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43   {..if ((ctx = C
a980: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72  TX_Init(statePtr
a990: 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c  , server, proto,
a9a0: 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69   keyfile, certfi
a9b0: 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 28  le, key, cert, (
a9c0: 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20  int) key_len,.. 
a9d0: 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65     (int) cert_le
a9e0: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c  n, CApath, CAfil
a9f0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
aa00: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
aa10: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
aa20: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
aa30: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
aa40: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
aa50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
aa60: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
aa70: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
aa80: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
aa90: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
aaa0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
aab0: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
aac0: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
aad0: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
aae0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
aaf0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
ab00: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
ab10: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
ab20: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
ab30: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
ab40: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
ab50: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
ab60: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
ab70: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
ab80: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
ab90: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
aba0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
abb0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
abc0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
abd0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
abe0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
abf0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
ac00: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
ac10: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
ac20: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
ac30: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
ac40: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ac50: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ac60: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
ac70: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
ac80: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ac90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aca0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
acb0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
acc0: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
acd0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
ace0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
acf0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
ad00: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
ad10: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
ad20: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ad30: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad40: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
ad50: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
ad60: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
ad70: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
ad80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ad90: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
ada0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
adb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
adc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
add0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
ade0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
adf0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
ae00: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
ae10: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
ae20: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
ae30: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
ae40: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
ae50: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
ae60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
ae70: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
ae80: 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41  Ptr,..(TCL_READA
ae90: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42  BLE | TCL_WRITAB
aea0: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20  LE), chan);.    
aeb0: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64  dprintf("Created
aec0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25   channel named %
aed0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
aee0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
aef0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20  >self));.    if 
af00: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20  (statePtr->self 
af10: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
af20: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a   NULL) {../*.. *
af30: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45   No use of Tcl_E
af40: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65  ventuallyFree be
af50: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c  cause no possibl
af60: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a  e Tcl_Preserve..
af70: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28  . */..Tls_Free((
af80: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
af90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
afa0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
afb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
afc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
afd0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
afe0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63  translation", Tc
aff0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
b000: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
b010: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54  slation));.    T
b020: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
b030: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
b040: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e  ePtr->self, "-en
b050: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  coding", Tcl_DSt
b060: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b070: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
b080: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
b090: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b0a0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
b0b0: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  lf, "-eofchar", 
b0c0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b0d0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
b0e0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c  FChar));.    Tcl
b0f0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
b100: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
b110: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63  tr->self, "-bloc
b120: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  king", Tcl_DStri
b130: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b140: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b  annelBlocking));
b150: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
b160: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b170: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
b180: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
b190: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b1a0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
b1b0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b1c0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
b1d0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
b1e0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b1f0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b200: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
b210: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61  * SSL Initializa
b220: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  tion.     */.   
b230: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d   statePtr->ssl =
b240: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74   SSL_new(statePt
b250: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20  r->ctx);.    if 
b260: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  (!statePtr->ssl)
b270: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61   {../* SSL libra
b280: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c  ry error */..Tcl
b290: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b2a0: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20  terp, "couldn't 
b2b0: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65  construct ssl se
b2c0: 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52  ssion: ", GET_ER
b2d0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b2e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b2f0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b300: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b310: 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54   "IMPORT", "INIT
b320: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b330: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
b340: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
b350: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
b360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b370: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
b380: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65  host server name
b390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76   */.    if (serv
b3a0: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65  ername) {../* Se
b3b0: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ts the server na
b3c0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
b3d0: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c  NI) in ClientHel
b3e0: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a  lo extension */.
b3f0: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36  ./* Per RFC 6066
b400: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20  , hostname is a 
b410: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74  ASCII encoded st
b420: 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43  ring, though RFC
b430: 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38   4366 says UTF-8
b440: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73  . */..if (!SSL_s
b450: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e  et_tlsext_host_n
b460: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
b470: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26  l, servername) &
b480: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20  & require) {..  
b490: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b4a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b4b0: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61  SNI extension fa
b4c0: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
b4d0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b4e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b4f0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b500: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b510: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c  "IMPORT", "SNI",
b520: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b530: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b540: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b550: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b560: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b570: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  OR;..}.../* Set 
b580: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65  hostname for pee
b590: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f  r certificate ho
b5a0: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74  stname verificat
b5b0: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a  ion in clients..
b5c0: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53  .   Don't use SS
b5d0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63  L_set1_host sinc
b5e0: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74  e it has limitat
b5f0: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53  ions. */..if (!S
b600: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61  SL_add1_host(sta
b610: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
b620: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20  ername)) {..    
b630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b640: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e  (interp, "Set DN
b650: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65  S hostname faile
b660: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b670: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b680: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b690: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b6a0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b6b0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b6c0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b6d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b6e0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b6f0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b710: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b720: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b730: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b740: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b750: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b760: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b770: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b780: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b790: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b7a0: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b7b0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b7c0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b7d0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
b7e0: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b7f0: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b800: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b810: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b830: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69  sume session fai
b840: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b850: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b860: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b870: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b880: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b890: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b8a0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b8b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b8c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
b8d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b8e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b8f0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
b900: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41  .    /* Enable A
b910: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72  pplication-Layer
b920: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69   Protocol Negoti
b930: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20  ation. Examples 
b940: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09  are: http/1.0,..
b950: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
b960: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70  , ftp, imap, pop
b970: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20  3, xmpp-client, 
b980: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74  xmpp-server, mqt
b990: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a  t, irc, etc. */.
b9a0: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a      if (alpn) {.
b9b0: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43  ./* Convert a TC
b9c0: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72  L list into a pr
b9d0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77  otocol-list in w
b9e0: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75  ire-format */..u
b9f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
ba00: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67  otos, *p;..unsig
ba10: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c  ned int protos_l
ba20: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a  en = 0;..Tcl_Siz
ba30: 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a  e cnt, i;..int j
ba40: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73  ;..Tcl_Obj **lis
ba50: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73  t;...if (Tcl_Lis
ba60: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
ba70: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63  interp, alpn, &c
ba80: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43  nt, &list) != TC
ba90: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73  L_OK) {..    Tls
baa0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
bab0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
bac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bad0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
bae0: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
baf0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
bb00: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bb10: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
bb20: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
bb30: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
bb40: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
bb50: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
bb60: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
bb70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bb80: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
bb90: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f  otocol names too
bba0: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29   long", (char *)
bbb0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65   NULL);...Tcl_Se
bbc0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
bbd0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
bbe0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
bbf0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
bc00: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
bc10: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
bc20: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  tr);...return TC
bc30: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
bc40: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20  .    protos_len 
bc50: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e  += 1 + (int) len
bc60: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
bc70: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
bc80: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
bc90: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
bca0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
bcb0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
bcc0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
bcd0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
bce0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
bcf0: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70  /..for (j = 0, p
bd00: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63   = protos; j < c
bd10: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; j++) {..    
bd20: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
bd30: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bd40: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b  (list[j], &len);
bd50: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e  ..    *p++ = (un
bd60: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e  signed char) len
bd70: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
bd80: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c   str, (size_t) l
bd90: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c  en);..    p += l
bda0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f  en;..}.../* SSL_
bdb0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20  set_alpn_protos 
bdc0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
bdd0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
bde0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54  t */../* Note: T
bdf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
be00: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72  verses the retur
be10: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69  n value conventi
be20: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73  on */..if (SSL_s
be30: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73  et_alpn_protos(s
be40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72  tatePtr->ssl, pr
be50: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e  otos, protos_len
be60: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
be70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
be80: 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f  p, "Set ALPN pro
be90: 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22  tocols failed: "
bea0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
beb0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
bec0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
bed0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
bee0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
bef0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
bf00: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
bf10: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
bf20: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
bf30: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72  ePtr);..    ckfr
bf40: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20  ee(protos);..   
bf50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bf60: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65  R;..}.../* Store
bf70: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
bf80: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  */..statePtr->pr
bf90: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09  otos = protos;..
bfa0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
bfb0: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65  _len = protos_le
bfc0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
bfd0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
bfe0: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65  s = NULL;..state
bff0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c000: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
c010: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
c020: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
c030: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f      SSL_set_app_
c040: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73  data(statePtr->s
c050: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
c060: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20  ePtr);./* point 
c070: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20  back to us */.  
c080: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79    SSL_set_verify
c090: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c0a0: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61  verify, VerifyCa
c0b0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
c0c0: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61  _set_info_callba
c0d0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
c0e0: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b  , InfoCallback);
c0f0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  ..    /* Callbac
c100: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20  k for observing 
c110: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65  protocol message
c120: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  s */.#ifndef OPE
c130: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
c140: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53  E.    /* void SS
c150: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
c160: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
c170: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
c180: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
c190: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
c1a0: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73  t_msg_callback(s
c1b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65  tatePtr->ctx, Me
c1c0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20  ssageCallback); 
c1d0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  */.    SSL_set_m
c1e0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
c1f0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c200: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c210: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73  ;.    SSL_set_ms
c220: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
c230: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67  Ptr->ssl, Messag
c240: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64  eCallback);.#end
c250: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  if..    /* Creat
c260: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49  e Tcl_Channel BI
c270: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20  O Handler */.   
c280: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
c290: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73  .= BIO_new_tcl(s
c2a0: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43  tatePtr, BIO_NOC
c2b0: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65  LOSE);.    state
c2c0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e  Ptr->bio.= BIO_n
c2d0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b  ew(BIO_f_ssl());
c2e0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
c2f0: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63  ) {../* Server c
c300: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c  allbacks */..SSL
c310: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
c320: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73  servername_arg(s
c330: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
c340: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c350: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
c360: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
c370: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c380: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62  r->ctx, SNICallb
c390: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ack);..SSL_CTX_s
c3a0: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
c3b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c3c0: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c  , HelloCallback,
c3d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c3e0: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74  r);..if (statePt
c3f0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
c400: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
c410: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63  X_set_alpn_selec
c420: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  t_cb(statePtr->c
c430: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  tx, ALPNCallback
c440: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c450: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f  tr);.#ifdef USE_
c460: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73  NPN..    if (tls
c470: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c480: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c  _3 == 0) {...SSL
c490: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
c4a0: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f  otos_advertised_
c4b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c4c0: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28  , NPNCallback, (
c4d0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c4e0: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  ;..    }.#endif.
c4f0: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73  .}.../* Enable s
c500: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65  erver to send ce
c510: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72  rt request after
c520: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20   handshake (TLS 
c530: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a  1.3 only) */../*
c540: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69   A write operati
c550: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61  on must take pla
c560: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69  ce for the Certi
c570: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74  ficate Request t
c580: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f  o be..   sent to
c590: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69   the client, thi
c5a0: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69  s can be done wi
c5b0: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68  th SSL_do_handsh
c5c0: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72  ake(). */..if (r
c5d0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
c5e0: 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31  andshake && tls1
c5f0: 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76  _3) {..    SSL_v
c600: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73  erify_client_pos
c610: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74  t_handshake(stat
c620: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a  ePtr->ssl);..}..
c630: 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69  ./* set automati
c640: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f  c curve selectio
c650: 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63  n */..SSL_set_ec
c660: 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72  dh_auto(statePtr
c670: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20  ->ssl, 1);.../* 
c680: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20  Set server mode 
c690: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  */..statePtr->fl
c6a0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53  ags |= TLS_TCL_S
c6b0: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f  ERVER;..SSL_set_
c6c0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61  accept_state(sta
c6d0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
c6e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c   } else {../* Cl
c6f0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a  ient callbacks *
c700: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
c710: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c720: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26  protos != NULL &
c730: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26  & tls1_2 == 0 &&
c740: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
c750: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c760: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65  _next_proto_sele
c770: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
c780: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
c790: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c7a0: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  Ptr);..}.#endif.
c7b0: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
c7c0: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
c7d0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
c7e0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
c7f0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
c800: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
c810: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
c820: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
c830: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
c840: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
c850: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
c860: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
c870: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
c880: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
c890: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
c8a0: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
c8b0: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
c8c0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
c8d0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
c8e0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
c8f0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
c900: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c910: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  1);..}.../* Set 
c920: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09  client mode */..
c930: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f  SSL_set_connect_
c940: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
c950: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
c960: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74  SSL_set_bio(stat
c970: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65  ePtr->ssl, state
c980: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74  Ptr->p_bio, stat
c990: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20  ePtr->p_bio);.  
c9a0: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74    BIO_set_ssl(st
c9b0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61  atePtr->bio, sta
c9c0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f  tePtr->ssl, BIO_
c9d0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f  NOCLOSE);..    /
c9e0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20  *.     * End of 
c9f0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f  SSL Init.     */
ca00: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
ca10: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c  turning %s", Tcl
ca20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
ca30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
ca40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
ca50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
ca60: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  r *) Tcl_GetChan
ca70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
ca80: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
ca90: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74  ATILE);..    ret
caa0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
cab0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caf0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
cb00: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d  nimportObjCmd --
cb10: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
cb20: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
cb30: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
cb40: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66  opmost channel f
cb50: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  ilter.. *. * Res
cb60: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
cb70: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
cb80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
cb90: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
cba0: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
cbb0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
cbc0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
cc10: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72  atic int.Unimpor
cc20: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
cc30: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
cc40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cc50: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
cc60: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
cc70: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
cc80: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
cc90: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
cca0: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
ccb0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
ccc0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
ccd0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
cce0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
ccf0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
cd00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cd10: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
cd20: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
cd30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cd40: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
cd50: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
cd60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
cd70: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
cd80: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
cd90: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
cda0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
cdb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cdc0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
cdd0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
cde0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
cdf0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
ce00: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
ce10: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69  el(chan);..    i
ce20: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
ce30: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
ce40: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
ce50: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
ce60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
ce70: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
ce80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
ce90: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
cea0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
ceb0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  el", (char *) NU
cec0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
ced0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
cee0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50  p, "TLS", "UNIMP
cef0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
cf00: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
cf10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..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 69 66 20 28 54 63     }..    if (Tc
cf40: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c  l_UnstackChannel
cf50: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d  (interp, chan) =
cf60: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
cf70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cf80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
cf90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
cfa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfe0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
cff0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
d000: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
d010: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
d020: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
d030: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
d040: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
d050: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d060: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
d070: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
d080: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
d0d0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
d0e0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
d0f0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
d100: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
d110: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
d120: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
d130: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
d140: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
d150: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74   char *cert, int
d160: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65   key_len, int ce
d170: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  rt_len, char *CA
d180: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a  path,.    char *
d190: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69  CAfile, char *ci
d1a0: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70  phers, char *cip
d1b0: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c  hersuites, int l
d1c0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61  evel, char *DHpa
d1d0: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f  rams) {.    Tcl_
d1e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
d1f0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
d200: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
d210: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
d220: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
d230: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c      int off = 0,
d240: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   abort = 0;.    
d250: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65  int load_private
d260: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  _key;.    const 
d270: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68  SSL_METHOD *meth
d280: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  od;..    dprintf
d290: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
d2a0: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09   if (!proto) {..
d2b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d2c0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
d2d0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
d2e0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  cted", (char *) 
d2f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d300: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
d310: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f  /* create SSL co
d320: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45  ntext */.#if OPE
d330: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
d340: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30  BER >= 0x1010000
d350: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f  0L || defined(NO
d360: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL2) || define
d370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d380: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
d390: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d3a0: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63  OTO_SSL2)) {..Tc
d3b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d3c0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f  nterp, "SSL2 pro
d3d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d3e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
d3f0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d400: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d410: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d420: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
d430: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d440: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d450: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d460: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c  TO_SSL3)) {..Tcl
d470: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d480: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74  terp, "SSL3 prot
d490: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d4a0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d4b0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d4c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d4d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d4e0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
d4f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d500: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d510: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d520: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f  O_TLS1)) {..Tcl_
d530: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d540: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72  erp, "TLS 1.0 pr
d550: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d560: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d570: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d580: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d590: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d5a0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
d5b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d5c0: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45  LS1_1).    if (E
d5d0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d5e0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29  S_PROTO_TLS1_1))
d5f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d610: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.1 protocol n
d620: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d630: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d640: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d650: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d660: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d670: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d680: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
d690: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d6a0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d6b0: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
d6c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d6d0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
d6e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d6f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d700: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d710: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d720: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d730: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
d740: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d750: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45  LS1_3).    if (E
d760: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d770: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29  S_PROTO_TLS1_3))
d780: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d7a0: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.3 protocol n
d7b0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d7c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d7d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d7e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
d7f0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a   (proto == 0) {.
d800: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e  ./* Use full ran
d810: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ge */..SSL_CTX_s
d820: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72  et_min_proto_ver
d830: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53  sion(ctx, 0);..S
d840: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
d850: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
d860: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
d870: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20   switch (proto) 
d880: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
d890: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d8a0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
d8b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d8c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d8d0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
d8e0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d8f0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  SSL2:..method = 
d900: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32  isServer ? SSLv2
d910: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d920: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f   : SSLv2_client_
d930: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d940: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d950: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
d960: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d970: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
d980: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d990: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
d9a0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d9b0: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64  TO_SSL3:..method
d9c0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
d9d0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv3_server_metho
d9e0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65  d() : SSLv3_clie
d9f0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
da00: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
da10: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
da20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
da30: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
da40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
da50: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
da60: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
da70: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74  PROTO_TLS1:..met
da80: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
da90: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65   TLSv1_server_me
daa0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63  thod() : TLSv1_c
dab0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
dac0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
dad0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dae0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
daf0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
db00: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
db10: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
db20: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
db30: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
db40: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_1:..method =
db50: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
db60: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_1_server_metho
db70: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c  d() : TLSv1_1_cl
db80: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
db90: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
dba0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
dbb0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
dbc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dbd0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
dbe0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dbf0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _2_METHOD).    c
dc00: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
dc10: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_2:..method = 
dc20: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
dc30: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _2_server_method
dc40: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69  () : TLSv1_2_cli
dc50: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
dc60: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
dc70: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
dc80: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
dc90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dca0: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  _3).    case TLS
dcb0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09  _PROTO_TLS1_3:..
dcc0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72  /* Use the gener
dcd0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f  ic method and co
dce0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61  nstraint range a
dcf0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20  fter context is 
dd00: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68  created */..meth
dd10: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
dd20: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
dd30: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
dd40: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
dd50: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
dd60: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74  fault:../* Negot
dd70: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61  iate highest ava
dd80: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76  ilable SSL/TLS v
dd90: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f  ersion */..metho
dda0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
ddb0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
ddc0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
ddd0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50  method();.#if OP
dde0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
ddf0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
de00: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
de10: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
de20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
de30: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL2)..off |= (EN
de40: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
de50: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f  _PROTO_SSL2)   ?
de60: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
de70: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv2);.#endif.#i
de80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
de90: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
dea0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
deb0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dec0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
ded0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
dee0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
def0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
df00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
df10: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
df20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66  SSL_NO_TLS1)..of
df30: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
df40: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
df50: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  LS1)   ? 0 : SSL
df60: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23  _OP_NO_TLSv1);.#
df70: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
df80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
df90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dfa0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66  L_NO_TLS1_1)..of
dfb0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
dfc0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
dfd0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_1) ? 0 : SSL
dfe0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b  _OP_NO_TLSv1_1);
dff0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e000: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
e010: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e020: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09  SSL_NO_TLS1_2)..
e030: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
e040: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e050: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53  _TLS1_2) ? 0 : S
e060: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32  SL_OP_NO_TLSv1_2
e070: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
e080: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
e090: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e0a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
e0b0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
e0c0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
e0d0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a  TO_TLS1_3) ? 0 :
e0e0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
e0f0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65  _3);.#endif..bre
e100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  ak;.    }..    E
e110: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
e120: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  ;..    ctx = SSL
e130: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
e140: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20  ;.    if (!ctx) 
e150: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
e160: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67      }..    if (g
e170: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
e180: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58  ILE)) {..SSL_CTX
e190: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c  _set_keylog_call
e1a0: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67  back(ctx, KeyLog
e1b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
e1c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
e1d0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !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 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
e200: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52  (proto == TLS_PR
e210: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53  OTO_TLS1_3) {..S
e220: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
e230: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
e240: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
e250: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
e260: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
e270: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
e280: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65  RSION);.    }.#e
e290: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  ndif..    /* For
e2a0: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74  ce cipher select
e2b0: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72  ion order by ser
e2c0: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  ver */.    if (!
e2d0: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c  isServer) {..SSL
e2e0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e2f0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50  (ctx, SSL_OP_CIP
e300: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45  HER_SERVER_PREFE
e310: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23  RENCE);.    }..#
e320: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
e330: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
e340: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e  100000L.    Open
e350: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f  SSL_add_all_algo
e360: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61  rithms(); /* Loa
e370: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69  d ciphers and di
e380: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  gests */.#endif.
e390: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e3a0: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
e3b0: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
e3c0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
e3d0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
e3e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
e3f0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
e400: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
e410: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
e420: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
e430: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
e440: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
e450: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69  PRESSION);./* di
e460: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
e470: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
e480: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
e490: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
e4a0: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69  tx, off);../* di
e4b0: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76  sable protocol v
e4c0: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f  ersions */.#if O
e4d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e4e0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30  UMBER < 0x101010
e4f0: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  00L.    SSL_CTX_
e500: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53  set_mode(ctx, SS
e510: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52  L_MODE_AUTO_RETR
e520: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65  Y);./* handle ne
e530: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20  w handshakes in 
e540: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62  background. On b
e550: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65  y default in Ope
e560: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23  nSSL 1.1.1. */.#
e570: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54  endif.    SSL_CT
e580: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65  X_sess_set_cache
e590: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b  _size(ctx, 128);
e5a0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
e5b0: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72  r defined cipher
e5c0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73  s, cipher suites
e5d0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c  , and security l
e5e0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
e5f0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c  (ciphers != NULL
e600: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e610: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74  t_cipher_list(ct
e620: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09  x, ciphers)) {..
e630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e640: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
e650: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f  phers failed: No
e660: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
e670: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e680: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e690: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e6a0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
e6b0: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
e6c0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
e6d0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
e6e0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
e6f0: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f  suites)) {..Tcl_
e700: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e710: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
e720: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
e730: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
e740: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e750: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e760: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e770: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e780: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20  /* Set security 
e790: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
e7a0: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c  (level > -1 && l
e7b0: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20  evel < 6) {../* 
e7c0: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79  SSL_set_security
e7d0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43  _level */..SSL_C
e7e0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  TX_set_security_
e7f0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c  level(ctx, level
e800: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e810: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
e820: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
e830: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
e840: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
e850: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
e860: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e870: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e880: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c  cb_userdata(ctx,
e890: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
e8a0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  r);..    /* read
e8b0: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
e8c0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
e8d0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
e8e0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69  ilt-in one */.#i
e8f0: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  fdef OPENSSL_NO_
e900: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  DH.    if (DHpar
e910: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
e920: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e930: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72  (interp, "DH par
e940: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e  ameter support n
e950: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28  ot available", (
e960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e970: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e980: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e990: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
e9a0: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20   {..DH* dh;..if 
e9b0: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
e9c0: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62  L) {..    BIO *b
e9d0: 69 6f 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53  io;...    Tcl_DS
e9e0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
e9f0: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e  .    bio = BIO_n
ea00: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61  ew_file(F2N(DHpa
ea10: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29  rams, &ds), "r")
ea20: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29  ;..    if (!bio)
ea30: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
ea40: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c  Free(&ds);...Tcl
ea50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ea60: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
ea70: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74   find DH paramet
ea80: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72  ers file", (char
ea90: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
eaa0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
eab0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
eac0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d      }...    dh =
ead0: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48   PEM_read_bio_DH
eae0: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c  params(bio, NULL
eaf0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
eb00: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f      BIO_free(bio
eb10: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
eb20: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
eb30: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09     if (!dh) {...
eb40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
eb50: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
eb60: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61  not read DH para
eb70: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65  meters from file
eb80: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
eb90: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
eba0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
ebb0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
ebc0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74     SSL_CTX_set_t
ebd0: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a  mp_dh(ctx, dh);.
ebe0: 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29  .    DH_free(dh)
ebf0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ;...} else {..  
ec00: 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e    /* Use well kn
ec10: 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72  own DH parameter
ec20: 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c  s that have buil
ec30: 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20  t-in support in 
ec40: 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20  OpenSSL */..    
ec50: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74  if (!SSL_CTX_set
ec60: 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29  _dh_auto(ctx, 1)
ec70: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
ec80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ec90: 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65  Could not enable
eca0: 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c   set DH auto: ",
ecb0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
ecc0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
ecd0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
ece0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
ecf0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d   NULL;..    }..}
ed00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
ed10: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65     /* set our ce
ed20: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20  rtificate */.   
ed30: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65   load_private_ke
ed40: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63  y = 0;.    if (c
ed50: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  ertfile != NULL)
ed60: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65   {..load_private
ed70: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f  _key = 1;...Tcl_
ed80: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
ed90: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
eda0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
edb0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72  ile(ctx, F2N(cer
edc0: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  tfile, &ds), SSL
edd0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
ede0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
edf0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ee00: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
ee10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ee20: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
ee30: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
ee40: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
ee50: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
ee60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
ee70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
ee80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ee90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
eea0: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
eeb0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20  Free(&ds);..    
eec0: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
eed0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
eee0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
eef0: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
ef00: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
ef10: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65  SN1(ctx, cert_le
ef20: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
ef30: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ef40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ef50: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
ef60: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09  rtificate: ",...
ef70: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
ef80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ef90: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
efa0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
efb0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
efc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72     } else {..cer
efd0: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58  tfile = (char*)X
efe0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  509_get_default_
eff0: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69  cert_file();...i
f000: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
f010: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
f020: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53  ctx, certfile, S
f030: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
f040: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09   <= 0) {.#if 0..
f050: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f060: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f070: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
f080: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
f090: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
f0a0: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52  , ": ",...GET_ER
f0b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
f0c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
f0d0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
f0e0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
f0f0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
f100: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
f110: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
f120: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
f130: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
f140: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
f150: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
f160: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
f170: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
f180: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
f190: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
f1a0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
f1b0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
f1c0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
f1d0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
f1e0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
f1f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
f200: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
f210: 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c 5f      }...    Tcl_
f220: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
f230: 3b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  ;..    if (SSL_C
f240: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
f250: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
f260: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  keyfile, &ds), S
f270: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
f280: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
f290: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f2a0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
f2b0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
f2c0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
f2d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
f2e0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
f2f0: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
f300: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
f310: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f320: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
f330: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20   set public key 
f340: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c  file ", keyfile,
f350: 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f   " ",...    GET_
f360: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
f370: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
f380: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f390: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
f3a0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
f3b0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f3c0: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20  s);...} else if 
f3d0: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (key != NULL) {.
f3e0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
f3f0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
f400: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53  ASN1(EVP_PKEY_RS
f410: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f  A, ctx, key,key_
f420: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f  len) <= 0) {.../
f430: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
f440: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
f450: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
f460: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
f470: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f480: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
f490: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
f4a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f4b0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f4c0: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20   public key: ", 
f4d0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
f4e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f4f0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
f500: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
f510: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
f520: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
f530: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
f540: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
f550: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
f560: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
f570: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
f580: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
f590: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
f5a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f5b0: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
f5c0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
f5d0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
f5e0: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
f5f0: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
f600: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
f610: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f620: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
f630: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
f640: 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65  /* Set to use de
f650: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61  fault location a
f660: 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74  nd file for Cert
f670: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
f680: 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61  y (CA) certifica
f690: 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20  tes. The.     * 
f6a0: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20  verify path and 
f6b0: 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65  store can be ove
f6c0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
f6d0: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20  SL_CERT_DIR env 
f6e0: 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20  var. The verify 
f6f0: 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20  file can.     * 
f700: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
f710: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
f720: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20  LE env var. */. 
f730: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
f740: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
f750: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b  fy_paths(ctx)) {
f760: 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d  ..abort++;.    }
f770: 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64  ..    /* Overrid
f780: 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65  es for the CA ve
f790: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69  rify path and fi
f7a0: 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20  le */.    {.#if 
f7b0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
f7c0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
f7d0: 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68  000L..if (CApath
f7e0: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69   != NULL || CAfi
f7f0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
f800: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
f810: 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  s1;..    Tcl_DSt
f820: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09  ringInit(&ds);..
f830: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
f840: 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20  nit(&ds1);...   
f850: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
f860: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69  ad_verify_locati
f870: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ons(ctx, F2N(CAf
f880: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43  ile, &ds), F2N(C
f890: 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b  Apath, &ds1))) {
f8a0: 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20  ...abort++;..   
f8b0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
f8c0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
f8d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f8e0: 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20  ee(&ds1);...    
f8f0: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43  /* Set list of C
f900: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c  As to send to cl
f910: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73  ient when reques
f920: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65  ting a client ce
f930: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
f940: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75    /* https://sou
f950: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74  rceforge.net/p/t
f960: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09  ls/bugs/57/ */..
f970: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a      /* XXX:TODO:
f980: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75   Let the user su
f990: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65  pply values here
f9a0: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65   instead of some
f9b0: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74  thing that exist
f9c0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73  s on the filesys
f9d0: 74 65 6d 20 2a 2f 0a 09 20 20 20 20 54 63 6c 5f  tem */..    Tcl_
f9e0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
f9f0: 3b 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  ;..    STACK_OF(
fa00: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
fa10: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
fa20: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
fa30: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
fa40: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
fa50: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
fa60: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
fa70: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
fa80: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
fa90: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
faa0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
fab0: 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28  ..}..#else..if (
fac0: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20  CApath != NULL) 
fad0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
fae0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20  ngInit(&ds);..  
faf0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c    if (!SSL_CTX_l
fb00: 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63  oad_verify_dir(c
fb10: 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  tx, F2N(CApath, 
fb20: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  &ds))) {...abort
fb30: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
fb40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
fb50: 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41  &ds);..}..if (CA
fb60: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
fb70: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
fb80: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20  Init(&ds);..    
fb90: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
fba0: 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74  d_verify_file(ct
fbb0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
fbc0: 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b  ds))) {...abort+
fbd0: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  +;..    }..    T
fbe0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
fbf0: 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65  ds);...    /* Se
fc00: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f  t list of CAs to
fc10: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20   send to client 
fc20: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
fc30: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69  a client certifi
fc40: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 54 63 6c  cate */..    Tcl
fc50: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
fc60: 29 3b 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46  );..    STACK_OF
fc70: 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72  (X509_NAME) *cer
fc80: 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61  tNames = SSL_loa
fc90: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65  d_client_CA_file
fca0: 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73  (F2N(CAfile, &ds
fcb0: 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72  ));..    if (cer
fcc0: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tNames != NULL) 
fcd0: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  {...SSL_CTX_set_
fce0: 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63  client_CA_list(c
fcf0: 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a  tx, certNames);.
fd00: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
fd10: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
fd20: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ;..}.#endif.    
fd30: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74  }..    return ct
fd40: 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  x;.}.../*. *----
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fd90: 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43   *. * StatusObjC
fda0: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72  md -- return cer
fdb0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e  tificate for con
fdc0: 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a  nected peer.. *.
fdd0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
fde0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
fdf0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
fe00: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
fe10: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
fe60: 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75  static int.Statu
fe70: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
fe80: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
fe90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fea0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
feb0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
fec0: 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  []) {.    State 
fed0: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58  *statePtr;.    X
fee0: 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54  509 *peer;.    T
fef0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
ff00: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
ff10: 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a  chan;.    char *
ff20: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69  channelName, *ci
ff30: 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d  phers;.    int m
ff40: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ode;.    const u
ff50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
ff60: 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  oto;.    unsigne
ff70: 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69  d int len;.    i
ff80: 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20  nt nid, res;.   
ff90: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
ffa0: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
ffb0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
ffc0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c   if (objc < 2 ||
ffd0: 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62   objc > 3 || (ob
ffe0: 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63  jc == 3 && !strc
fff0: 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
10000 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63  (objv[1]), "-loc
10010 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72  al"))) {..Tcl_Wr
10020 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10030 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c  p, 1, objv, "?-l
10040 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b  ocal? channel");
10050 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
10060 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
10070 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64  * Get channel Id
10080 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e   */.    channelN
10090 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
100a0 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d  ing(objv[(objc =
100b0 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a  = 2 ? 1 : 2)]);.
100c0 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
100d0 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
100e0 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26  , channelName, &
100f0 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
10100 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
10110 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
10120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10130 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
10140 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
10150 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
10160 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
10170 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
10180 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
10190 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
101a0 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
101b0 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
101c0 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
101d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
101e0 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
101f0 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
10200 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
10210 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
10220 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
10230 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f   *) NULL);..Tcl_
10240 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
10250 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41  erp, "TLS", "STA
10260 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  TUS", "CHANNEL",
10270 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
10280 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
10290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
102a0 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
102b0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63  r = (State *) Tc
102c0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
102d0 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
102e0 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74  .    /* Get cert
102f0 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72  ificate for peer
10300 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   or self */.    
10310 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
10320 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
10330 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74  _peer_certificat
10340 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
10350 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10360 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  peer = SSL_get_c
10370 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
10380 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
10390 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39  .    /* Get X509
103a0 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66   certificate inf
103b0 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65  o */.    if (pee
103c0 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  r) {..objPtr = T
103d0 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e  ls_NewX509Obj(in
103e0 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66  terp, peer);..if
103f0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10400 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65      X509_free(pe
10410 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d  er);..    peer =
10420 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
10430 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d  else {..objPtr =
10440 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
10450 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  0, NULL);.    }.
10460 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d  .    /* Peer nam
10470 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  e */.    LAPPEND
10480 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10490 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c  Ptr, "peername",
104a0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61   SSL_get0_peerna
104b0 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
104c0 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50  ), -1);.    LAPP
104d0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
104e0 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c  objPtr, "sbits",
104f0 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f   SSL_get_cipher_
10500 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73  bits(statePtr->s
10510 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20  sl, NULL));..   
10520 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72   ciphers = (char
10530 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  *)SSL_get_cipher
10540 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
10550 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10570 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65   "cipher", ciphe
10580 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  rs, -1);..    /*
10590 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39   Verify the X509
105a0 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65   certificate pre
105b0 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65  sented by the pe
105c0 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  er */.    LAPPEN
105d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
105e0 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73  jPtr, "verifyRes
105f0 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69  ult",..X509_veri
10600 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
10610 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72  ring(SSL_get_ver
10620 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
10630 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b  Ptr->ssl)), -1);
10640 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
10650 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65  mode */.    mode
10660 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66   = SSL_get_verif
10670 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d  y_mode(statePtr-
10680 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d  >ssl);.    if (m
10690 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
106a0 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45  Y_NONE) {..LAPPE
106b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
106c0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
106d0 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  de", "none", -1)
106e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
106f0 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a  Tcl_Obj *listObj
10700 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
10710 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
10720 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10730 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09  VERIFY_PEER) {..
10740 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10750 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10760 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10770 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10780 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a  j("peer", -1));.
10790 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
107a0 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
107b0 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29  IF_NO_PEER_CERT)
107c0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
107d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
107e0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
107f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10800 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e  ngObj("fail if n
10810 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31  o peer cert", -1
10820 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
10830 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   && SSL_VERIFY_C
10840 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20  LIENT_ONCE) {.. 
10850 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10860 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10870 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
10880 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10890 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20  ("client once", 
108a0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
108b0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
108c0 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29  _POST_HANDSHAKE)
108d0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
108e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
108f0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
10900 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10910 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64  ngObj("post hand
10920 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d  shake", -1));..}
10930 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e  ..LAPPEND_OBJ(in
10940 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76  terp, objPtr, "v
10950 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74  erifyMode", list
10960 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20  ObjPtr).    }.. 
10970 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64     /* Verify mod
10980 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c  e depth */.    L
10990 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
109a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
109b0 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65  fyDepth", SSL_ge
109c0 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73  t_verify_depth(s
109d0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a  tatePtr->ssl));.
109e0 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74  .    /* Report t
109f0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
10a00 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
10a10 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74   of the negotiat
10a20 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67  ion */.    SSL_g
10a30 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
10a40 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10a50 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a   &proto, &len);.
10a60 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10a70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10a80 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29  "alpn", (char *)
10a90 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65  proto, (Tcl_Size
10aa0 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50  ) len);.    LAPP
10ab0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10ac0 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f  objPtr, "protoco
10ad0 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73  l", SSL_get_vers
10ae0 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
10af0 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  l), -1);..    /*
10b00 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52   Valid for non-R
10b10 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64  SA signature and
10b20 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
10b30 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
10b40 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
10b50 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e  peer_signature_n
10b60 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
10b70 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65  , &nid);.    } e
10b80 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
10b90 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e  _get_signature_n
10ba0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
10bb0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
10bc0 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
10bd0 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
10be0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10bf0 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
10c00 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22  reHashAlgorithm"
10c10 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64  , OBJ_nid2ln(nid
10c20 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20  ), -1);..    if 
10c30 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72  (objc == 2) {..r
10c40 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  es = SSL_get_pee
10c50 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  r_signature_type
10c60 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10c70 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
10c80 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
10c90 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
10ca0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
10cb0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
10cc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
10cd0 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20  es) {nid = 0;}. 
10ce0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10cf0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10d00 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20  signatureType", 
10d10 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
10d20 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53   -1);..    Tcl_S
10d30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10d40 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
10d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10d60 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
10d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
10db0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66   * ConnectionInf
10dc0 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  oObjCmd -- retur
10dd0 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  n connection inf
10de0 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  o from OpenSSL..
10df0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
10e00 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e  *.A list of conn
10e10 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a  ection info.  *.
10e20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e60 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
10e70 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e  c int Connection
10e80 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  InfoObjCmd(Clien
10e90 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
10ea0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
10eb0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
10ec0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
10ed0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
10ee0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
10ef0 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
10f00 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20  o set a mode on 
10f10 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
10f20 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
10f30 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
10f40 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
10f50 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
10f60 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
10f70 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
10f80 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
10f90 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
10fa0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
10fb0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
10fc0 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
10fd0 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
10fe0 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  entData;..    if
10ff0 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
11000 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11010 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11020 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
11030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
11050 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
11060 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
11070 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11080 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
11090 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
110a0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
110b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
110c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
110d0 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
110e0 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
110f0 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
11100 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
11110 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
11120 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
11130 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
11140 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
11150 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
11160 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11170 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
11180 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
11190 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
111a0 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
111b0 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
111c0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
111d0 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
111e0 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
111f0 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
11200 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
11210 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
11220 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
11230 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11240 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
11250 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
11260 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
11270 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
11280 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
11290 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
112a0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
112b0 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
112c0 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
112d0 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
112e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f  = NULL) {../* co
112f0 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a  nnection state *
11300 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11310 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11320 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74  state", SSL_stat
11330 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
11340 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  l), -1);.../* Ge
11350 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20  t SNI requested 
11360 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  server name */..
11370 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11380 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72  rp, objPtr, "ser
11390 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  vername", SSL_ge
113a0 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
113b0 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
113c0 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31  E_host_name), -1
113d0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74  );.../* Get prot
113e0 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  ocol */..LAPPEND
113f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11400 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  Ptr, "protocol",
11410 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e   SSL_get_version
11420 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  (ssl), -1);.../*
11430 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61   Renegotiation a
11440 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45  llowed */..LAPPE
11450 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11460 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74  objPtr, "renegot
11470 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c  iation_allowed",
11480 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f   SSL_get_secure_
11490 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75  renegotiation_su
114a0 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73  pport((SSL *) ss
114b0 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65  l));.../* Get se
114c0 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
114d0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
114e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
114f0 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53  curity_level", S
11500 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
11510 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f  level(ssl));.../
11520 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11530 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11540 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11550 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
11560 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  , SSL_session_re
11570 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  used(ssl));.../*
11580 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
11590 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
115a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
115b0 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53   "is_server", SS
115c0 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
115d0 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20  );.../* Is DTLS 
115e0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
115f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11600 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f   "is_dtls", SSL_
11610 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20  is_dtls(ssl));. 
11620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
11630 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
11640 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
11650 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
11660 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
11670 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
11680 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
11690 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
116a0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
116b0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a  /* Cipher name *
116c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
116d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
116e0 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50  cipher", SSL_CIP
116f0 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
11700 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11710 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
11720 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
11730 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11740 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  r, "standard_nam
11750 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73  e", SSL_CIPHER_s
11760 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
11770 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11780 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20  OpenSSL name of 
11790 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
117a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
117b0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f  bjPtr, "openssl_
117c0 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63  name", OPENSSL_c
117d0 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43  ipher_name(SSL_C
117e0 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
117f0 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31  ame(cipher)), -1
11800 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f  );.../* number o
11810 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73  f secret bits us
11820 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f  ed for cipher */
11830 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
11840 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
11850 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
11860 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11870 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11880 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74  ecret_bits", bit
11890 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
118a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
118b0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73   "algorithm_bits
118c0 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f  ", alg_bits);../
118d0 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63  * alg_bits is ac
118e0 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20  tual key secret 
118f0 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74  bits. If use bit
11900 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c  s and secret (al
11910 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69  gorithm) bits di
11920 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65  ffer,..   the re
11930 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61  st of the bits a
11940 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66  re fixed, i.e. f
11950 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72  or limited expor
11960 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20  t ciphers (bits 
11970 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e  < 56) */.../* In
11980 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53  dicates which SS
11990 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76  L/TLS protocol v
119a0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66  ersion first def
119b0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20  ined the cipher 
119c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
119d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
119e0 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53  "min_version", S
119f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
11a00 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
11a10 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  1);.../* Cipher 
11a20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  NID */..LAPPEND_
11a30 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11a40 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c  tr, "cipherNID",
11a50 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
11a60 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
11a70 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69  et_cipher_nid(ci
11a80 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
11a90 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11aa0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73  , objPtr, "diges
11ab0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  tNID", (char *)O
11ac0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11ad0 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f  PHER_get_digest_
11ae0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11af0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11b00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11b10 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22  "keyExchangeNID"
11b20 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11b30 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11b40 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65  get_kx_nid(ciphe
11b50 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
11b60 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11b70 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69  bjPtr, "authenti
11b80 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61  cationNID", (cha
11b90 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
11ba0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75  SL_CIPHER_get_au
11bb0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  th_nid(cipher)),
11bc0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61   -1);.../* messa
11bd0 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
11be0 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20  n code - Cipher 
11bf0 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43  is AEAD (e.g. GC
11c00 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f  M or ChaCha20/Po
11c10 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a  ly1305) or not *
11c20 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61  /../* Authentica
11c30 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77  ted Encryption w
11c40 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64  ith associated d
11c50 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b  ata (AEAD) check
11c60 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11c70 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11c80 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61  , "cipher_is_aea
11c90 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69  d", SSL_CIPHER_i
11ca0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b  s_aead(cipher));
11cb0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
11cc0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
11cd0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
11ce0 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
11cf0 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
11d00 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
11d10 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
11d20 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
11d30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11d40 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
11d50 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
11d60 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
11d70 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
11d80 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
11d90 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
11da0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
11db0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11dc0 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69   "cipher_id", (i
11dd0 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
11de0 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  et_id(cipher));.
11df0 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44  ../* Two-byte ID
11e00 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53   used in the TLS
11e10 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65   protocol of the
11e20 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f   given cipher */
11e30 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11e40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
11e50 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e  rotocol_id", (in
11e60 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
11e70 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69  t_protocol_id(ci
11e80 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78  pher));.../* Tex
11e90 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
11ea0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
11eb0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  /..if (SSL_CIPHE
11ec0 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69  R_description(ci
11ed0 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f  pher, buf, sizeo
11ee0 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
11ef0 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
11f00 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11f10 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e  tr, "description
11f20 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a  ", buf, -1);..}.
11f30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
11f40 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
11f50 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
11f60 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
11f70 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
11f80 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
11f90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11fa0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
11fb0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
11fc0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
11fd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11fe0 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
11ff0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
12000 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c   char buffer[SSL
12010 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
12020 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
12030 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
12040 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
12050 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
12060 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
12070 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
12080 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
12090 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
120a0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
120b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
120c0 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
120d0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
120e0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
120f0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
12100 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
12110 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
12120 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
12130 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
12140 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
12150 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
12160 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
12170 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
12180 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12190 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
121a0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
121b0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
121c0 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
121d0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
121e0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
121f0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
12200 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
12210 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
12220 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
12230 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12240 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
12250 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
12260 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12270 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12280 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
12290 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
122a0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
122b0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
122c0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
122d0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
122e0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
122f0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12300 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
12310 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
12320 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
12330 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
12340 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
12350 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
12360 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
12370 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12380 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
12390 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
123a0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
123b0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
123c0 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
123d0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
123e0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
123f0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
12400 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
12410 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
12420 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
12430 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
12440 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
12450 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
12460 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
12470 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12480 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
12490 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
124a0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
124b0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
124c0 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
124d0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
124e0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
124f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12500 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
12510 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
12520 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
12530 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
12540 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
12550 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12560 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12570 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
12580 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
12590 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
125a0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
125b0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
125c0 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20  app data */.#if 
125d0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
125e0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
125f0 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f  000L..SSL_SESSIO
12600 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
12610 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49  pdata((SSL_SESSI
12620 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26  ON *) session, &
12630 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
12640 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
12650 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12660 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61  "ticket_app_data
12670 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
12680 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e  Size) len2);.#en
12690 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  dif.../* Get mas
126a0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
126b0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
126c0 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
126d0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
126e0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
126f0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
12700 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12710 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
12720 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
12730 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12740 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
12750 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
12760 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
12770 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
12780 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
12790 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
127a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
127b0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
127c0 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
127d0 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
127e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
127f0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
12800 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
12810 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
12820 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
12830 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
12840 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
12850 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
12860 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12870 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
12880 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
12890 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
128a0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
128b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
128c0 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
128d0 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
128e0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
128f0 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
12900 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
12910 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12920 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
12930 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
12940 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
12950 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
12960 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
12970 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12980 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
12990 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
129a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
129b0 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
129c0 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
129d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
129e0 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
129f0 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
12a00 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
12a10 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
12a20 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
12a30 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
12a40 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
12a50 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12a60 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
12a70 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
12a80 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
12a90 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
12aa0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
12ab0 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
12ac0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12ad0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
12ae0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
12af0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
12b00 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12b10 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
12b20 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
12b30 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
12b40 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
12b50 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
12b60 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12b70 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12b80 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
12b90 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
12ba0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
12bb0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
12bc0 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
12bd0 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
12be0 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
12bf0 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
12c00 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
12c10 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
12c20 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
12c30 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
12c40 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
12c50 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
12c60 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
12c70 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
12c80 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
12c90 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
12ca0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
12cb0 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ];..for (int i =
12cc0 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f   0; i < sk_X509_
12cd0 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
12ce0 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
12cf0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d  509_NAME *name =
12d00 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61   sk_X509_NAME_va
12d10 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b  lue(ca_list, i);
12d20 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20  ..    if (name) 
12d30 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e  {...X509_NAME_on
12d40 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66  eline(name, buff
12d50 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54  er, BUFSIZ);...T
12d60 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12d70 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12d80 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
12d90 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
12da0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09  , -1));..    }..
12db0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50  }.    }.    LAPP
12dc0 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
12dd0 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22  objPtr, "caList"
12de0 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20  , listPtr);.    
12df0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
12e00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
12e10 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35  istCount", sk_X5
12e20 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c  09_NAME_num(ca_l
12e30 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ist));..    Tcl_
12e40 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12e50 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
12e60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12e70 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12ec0 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  . * VersionObjCm
12ed0 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73  d -- return vers
12ee0 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ion string from 
12ef0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
12f00 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
12f10 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
12f20 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
12f30 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
12f40 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
12f90 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62  ic int.VersionOb
12fa0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
12fb0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
12fc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
12fd0 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
12fe0 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
12ff0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
13000 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69  objPtr;.    (voi
13010 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  d) clientData;. 
13020 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a     (void) objc;.
13030 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b      (void) objv;
13040 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
13050 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62  alled");..    ob
13060 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
13070 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
13080 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
13090 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
130a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
130b0 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65  objPtr);..    re
130c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
130d0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
13120 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69  MiscObjCmd -- mi
13130 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  sc commands. *. 
13140 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
13150 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
13160 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
13170 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
13180 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
131d0 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62  tatic int.MiscOb
131e0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
131f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
13200 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
13210 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
13220 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
13230 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
13240 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e  nst char *comman
13250 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c  ds [] = { "req",
13260 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20   "strreq", NULL 
13270 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d  };.    enum comm
13280 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53  and { C_REQ, C_S
13290 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  TRREQ, C_DUMMY }
132a0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
132b0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74  md;.    int isSt
132c0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
132d0 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28  er[16384];.    (
132e0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
132f0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
13300 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
13310 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
13320 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13330 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
13340 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
13350 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
13360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13370 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
13380 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
13390 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
133a0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
133b0 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54  ", 0, &cmd) != T
133c0 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
133d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
133e0 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
133f0 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
13400 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
13410 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
13420 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
13430 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
13440 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
13450 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
13460 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
13470 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
13480 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
13490 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
134a0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
134b0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
134c0 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b   Tcl_Size listc;
134d0 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20  ..    int i;... 
134e0 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
134f0 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
13500 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
13510 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
13520 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
13530 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
13540 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
13550 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
13560 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
13570 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
13580 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13590 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
135a0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
135b0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
135c0 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
135d0 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
135e0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
135f0 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
13600 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
13610 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
13620 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
13630 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13640 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
13650 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
13660 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
13670 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13680 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
13690 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
136a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
136b0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
136c0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
136d0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
136e0 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
136f0 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
13700 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
13710 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
13720 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
13730 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
13740 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
13750 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
13760 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
13770 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
13780 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
13790 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
137a0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
137b0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
137c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
137d0 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  , &listc, &listv
137e0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
137f0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13800 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
13810 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
13820 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
13830 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
13840 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
13850 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
13860 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13870 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
13880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13890 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
138a0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
138b0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
138c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
138d0 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
138e0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
138f0 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
13900 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13910 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
13920 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
13930 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
13940 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13950 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13960 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
13970 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
13980 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13990 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
139a0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
139b0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
139c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
139d0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
139e0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
139f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
13a00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13a10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13a20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13a30 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
13a40 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
13a50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13a60 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13a70 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13a80 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
13a90 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
13aa0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13ab0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13ac0 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
13ad0 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
13ae0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13af0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13b00 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13b10 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
13b20 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
13b30 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13b40 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13b50 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
13b60 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
13b70 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
13b80 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13b90 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13ba0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
13bb0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
13bc0 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
13bd0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13be0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
13bf0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
13c00 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
13c10 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
13c20 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13c30 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
13c40 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
13c50 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13c60 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13c70 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
13c80 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
13c90 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
13ca0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
13cb0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
13cc0 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
13cd0 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
13ce0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13cf0 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
13d00 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
13d10 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
13d20 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
13d30 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
13d40 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
13d50 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
13d60 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13d70 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
13d80 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
13d90 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
13da0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
13db0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
13dc0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
13dd0 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
13de0 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
13df0 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
13e00 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
13e10 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
13e20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
13e30 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
13e40 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
13e50 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
13e60 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
13e70 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
13e80 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
13e90 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
13ea0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
13eb0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13ec0 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
13ed0 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
13ee0 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
13ef0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13f00 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
13f10 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
13f20 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
13f30 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
13f40 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
13f50 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
13f60 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
13f70 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
13f80 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
13f90 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
13fa0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
13fb0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
13fc0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
13fd0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
13fe0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
13ff0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
14000 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
14010 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
14020 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
14030 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
14040 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
14050 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
14060 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
14070 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14080 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
14090 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
140a0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
140b0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
140c0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
140d0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
140e0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
140f0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
14100 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
14110 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
14120 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
14130 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
14140 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
14150 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
14160 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
14170 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
14180 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
14190 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
141a0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
141b0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
141c0 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
141d0 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
141e0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
141f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14200 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
14210 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
14220 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
14230 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
14240 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58  _ERROR;...}....X
14250 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28  509_set_version(
14260 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f  cert,2);...ASN1_
14270 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39  INTEGER_set(X509
14280 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65  _get_serialNumbe
14290 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b  r(cert),serial);
142a0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
142b0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
142c0 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
142d0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
142e0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
142f0 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e  After(cert),(lon
14300 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29  g)60*60*24*days)
14310 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62  ;...X509_set_pub
14320 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a  key(cert,pkey);.
14330 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74  ...name=X509_get
14340 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
14350 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d  rt);....X509_NAM
14360 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14370 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53  xt(name,"C", MBS
14380 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14390 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
143a0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_C, -1, -1, 
143b0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
143c0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
143d0 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54  (name,"ST", MBST
143e0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
143f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14400 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_ST, -1, -1, 
14410 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14420 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14430 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52  (name,"L", MBSTR
14440 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14450 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14460 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_L, -1, -1, 0)
14470 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14480 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14490 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e  ame,"O", MBSTRIN
144a0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
144b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
144c0 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _O, -1, -1, 0);.
144d0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
144e0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
144f0 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47  e,"OU", MBSTRING
14500 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14510 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14520 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  OU, -1, -1, 0);.
14530 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14540 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14550 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47  e,"CN", MBSTRING
14560 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14570 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14580 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  CN, -1, -1, 0);.
14590 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
145a0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
145b0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52  e,"Email", MBSTR
145c0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
145d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
145e0 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31   k_Email, -1, -1
145f0 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65  , 0);....X509_se
14600 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
14610 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66  ert,name);....if
14620 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72   (!X509_sign(cer
14630 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35  t,pkey,EVP_sha25
14640 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35  6())) {...    X5
14650 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
14660 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
14670 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
14680 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
14690 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
146a0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
146b0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
146c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
146d0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
146e0 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63  signing certific
146f0 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  ate",NULL);...  
14700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14710 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69  OR;...}....if (i
14720 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
14730 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
14740 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
14750 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14760 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14770 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74    i=BIO_read(out
14780 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62  ,buffer,sizeof(b
14790 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20  uffer)-1);...   
147a0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69   i=(i<0) ? 0 : i
147b0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69  ;...    buffer[i
147c0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63  ]='\0';...    Tc
147d0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
147e0 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29  pemout,buffer,0)
147f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73  ;...    BIO_flus
14800 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49  h(out);...    BI
14810 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d  O_free(out);...}
14820 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75   else {...    ou
14830 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
14840 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42  file());...    B
14850 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d  IO_write_filenam
14860 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09  e(out,pemout);..
14870 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
14880 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
14890 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
148a0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a  e_all(out);...}.
148b0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72  ...X509_free(cer
148c0 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  t);...EVP_PKEY_f
148d0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
148e0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
148f0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
14900 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e  00L...BN_free(bn
14910 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20  e);.#endif..    
14920 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20  }..}..break;.   
14930 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b   default:..break
14940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14950 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
14960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14970 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20  ****/./* Init   
14980 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a            */./**
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149a0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
149b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
149f0 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a  . * Tls_Free --.
14a00 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
14a10 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
14a20 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
14a30 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
14a40 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
14a50 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
14a60 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
14a70 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  1. *. * Results:
14a80 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
14a90 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
14aa0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
14ab0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
14ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
14b00 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63  .void.Tls_Free(c
14b10 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b  har *blockPtr) {
14b20 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
14b30 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
14b40 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64  blockPtr;..    d
14b50 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14b60 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e  ;..    Tls_Clean
14b70 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  (statePtr);.    
14b80 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29  ckfree(blockPtr)
14b90 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14be0 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d  *. * Tls_Clean -
14bf0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
14c00 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70  cedure cleans up
14c10 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
14c20 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
14c30 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e  . *.is closed an
14c40 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  d its reference 
14c50 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f  count falls belo
14c60 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  w 1.  This shoul
14c70 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73  d. *.be called s
14c80 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20  ynchronously by 
14c90 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e  the CloseProc, n
14ca0 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65  ot in the. *.Eve
14cb0 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c  ntuallyFree call
14cc0 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  back.. *. * Resu
14cd0 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  lts:. *.none. *.
14ce0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
14cf0 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68  . *.Frees all th
14d00 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d  e state. *. *---
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d50 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c  . */.void Tls_Cl
14d60 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65  ean(State *state
14d70 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e  Ptr) {.    dprin
14d80 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
14d90 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27     /*.     * we'
14da0 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65  re assuming here
14db0 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67   that we're sing
14dc0 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20  le-threaded.    
14dd0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
14de0 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
14df0 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
14e00 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
14e10 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
14e20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
14e30 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
14e40 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  er = NULL;.    }
14e50 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
14e60 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63  tr->protos) {..c
14e70 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  kfree(statePtr->
14e80 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50  protos);..stateP
14e90 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c  tr->protos = NUL
14ea0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14eb0 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20  (statePtr->bio) 
14ec0 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20  {../* This will 
14ed0 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77  call SSL_shutdow
14ee0 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a  n. Bug 1414045 *
14ef0 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f  /..dprintf("BIO_
14f00 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73  free_all(%p)", s
14f10 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
14f20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61  BIO_free_all(sta
14f30 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74  tePtr->bio);..st
14f40 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55  atePtr->bio = NU
14f50 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
14f60 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29   (statePtr->ssl)
14f70 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c   {..dprintf("SSL
14f80 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74  _free(%p)", stat
14f90 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c  ePtr->ssl);..SSL
14fa0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
14fb0 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ssl);..statePtr-
14fc0 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ssl = NULL;.   
14fd0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14fe0 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c  Ptr->ctx) {..SSL
14ff0 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50  _CTX_free(stateP
15000 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65  tr->ctx);..state
15010 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b  Ptr->ctx = NULL;
15020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
15030 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15040 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  k) {..Tcl_DecrRe
15050 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
15060 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61  >callback);..sta
15070 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
15080 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
15090 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
150a0 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c  password) {..Tcl
150b0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _DecrRefCount(st
150c0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
150d0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61  );..statePtr->pa
150e0 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20  ssword = NULL;. 
150f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
15100 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09  tePtr->vcmd) {..
15110 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
15120 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
15130 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  ;..statePtr->vcm
15140 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
15150 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
15160 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23  turning");.}...#
15170 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  if TCL_MAJOR_VER
15180 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65  SION > 8.#define
15190 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e   MIN_VERSION "9.
151a0 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  0".#else.#define
151b0 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e   MIN_VERSION "8.
151c0 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  5".#endif../*. *
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e  ---. *. * Tls_In
15220 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
15230 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
15240 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
15250 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73  cedure, which is
15260 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63   called. *.by Tc
15270 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b  l when this pack
15280 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64  age is to be add
15290 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72  ed to an interpr
152a0 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  eter.. *. * Resu
152b0 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67  lts:  Ssl config
152c0 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a  ured and loaded.
152d0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
152e0 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74  ts:. *. create t
152f0 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20  he ssl command, 
15300 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63  initialize ssl c
15310 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ontext. *. *----
15320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15360 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e   */.DLLEXPORT in
15370 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49  t Tls_Init(Tcl_I
15380 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
15390 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
153a0 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
153b0 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20  [] = {.#include 
153c0 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30  "tls.tcl.h"..0x0
153d0 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70  0.    };..    dp
153e0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
153f0 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c  ..#ifdef USE_TCL
15400 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54  _STUBS.    if (T
15410 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
15420 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  erp, MIN_VERSION
15430 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  , 0) == NULL) {.
15440 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
15450 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
15460 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52      if (Tcl_PkgR
15470 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22  equire(interp, "
15480 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  Tcl", MIN_VERSIO
15490 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  N, 0) == NULL) {
154a0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
154b0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
154c0 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29  f (TlsLibInit(0)
154d0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   != TCL_OK) {..T
154e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
154f0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e  interp, "could n
15500 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53  ot initialize SS
15510 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61  L library", (cha
15520 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
15530 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15540 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72     }..    Tcl_Cr
15550 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15560 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70  nterp, "tls::cip
15570 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62  hers", CiphersOb
15580 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15590 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
155a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
155b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
155c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
155d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e  nterp, "tls::con
155e0 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63  nection", Connec
155f0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20  tionInfoObjCmd, 
15600 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15610 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15620 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15630 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15640 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15650 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65   "tls::handshake
15660 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43  ", HandshakeObjC
15670 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15680 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
15690 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
156a0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
156b0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
156c0 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72  erp, "tls::impor
156d0 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  t", ImportObjCmd
156e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
156f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15700 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15710 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15720 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15730 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72  p, "tls::unimpor
15740 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
15750 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15760 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
15770 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15780 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15790 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
157a0 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75  erp, "tls::statu
157b0 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  s", StatusObjCmd
157c0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
157d0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
157e0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
157f0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15800 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15810 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e  p, "tls::version
15820 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64  ", VersionObjCmd
15830 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
15840 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15850 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15860 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15870 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15880 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20  p, "tls::misc", 
15890 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MiscObjCmd, (Cli
158a0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
158b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
158c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
158d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
158e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
158f0 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50  s::protocols", P
15900 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20  rotocolsObjCmd, 
15910 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15920 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15930 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15940 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29  .    if (interp)
15950 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74   {..Tcl_Eval(int
15960 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53  erp, tlsTclInitS
15970 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  cript);.    }.. 
15980 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b     return Tcl_Pk
15990 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
159a0 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50   PACKAGE_NAME, P
159b0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
159c0 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2a  ---------------*
15a00 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49  . *. *.Tls_SafeI
15a10 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
15a50 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65  *.Standard proce
15a60 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79  dure required by
15a70 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74   'load'.. *.Init
15a80 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74  ializes this ext
15a90 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66  ension for a saf
15aa0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  e interpreter.. 
15ab0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ae0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
15af0 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f  ffects:. *..As o
15b00 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
15b10 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
15b20 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72   standard Tcl er
15b30 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ror code.. *. *-
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b70 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58  -----*. */.DLLEX
15b80 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66  PORT int Tls_Saf
15b90 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
15ba0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
15bb0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
15bc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c  );.    return Tl
15bd0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
15be0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15c20 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74   *. *.TlsLibInit
15c30 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49  ----------*. *.I
15c70 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
15c80 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20  ibrary once per 
15c90 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d  application. *.-
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15cd0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
15ce0 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c  cts:. *..initial
15cf0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
15d00 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
15d10 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d  *..none. *. *---
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d50 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ---*. */.static 
15d60 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69  int TlsLibInit(i
15d70 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  nt uninitialize)
15d80 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e   {.    static in
15d90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  t initialized = 
15da0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75  0;.    int statu
15db0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20  s = TCL_OK;.#if 
15dc0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15dd0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15de0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15df0 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f  .    size_t num_
15e00 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20  locks;.#endif.. 
15e10 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c     if (uninitial
15e20 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69  ize) {..if (!ini
15e30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20  tialized) {..   
15e40 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20   dprintf("Asked 
15e50 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c  to uninitialize,
15e60 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20   but we are not 
15e70 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a  initialized");..
15e80 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15e90 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66  OK;..}...dprintf
15ea0 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69  ("Asked to unini
15eb0 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20  tialize");..#if 
15ec0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15ed0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15ee0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15ef0 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28  ..Tcl_MutexLock(
15f00 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20  &init_mx);...if 
15f10 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66  (locks) {..    f
15f20 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20  ree(locks);..   
15f30 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09   locks = NULL;..
15f40 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d      locksCount =
15f50 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69   0;..}.#endif..i
15f60 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
15f70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15f80 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15f90 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15fa0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
15fb0 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
15fc0 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
15fd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
15fe0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c  .    if (initial
15ff0 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66  ized) {..dprintf
16000 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73  ("Called, but us
16010 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65  ing cached value
16020 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 74  ");..return stat
16030 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  us;.    }..    d
16040 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
16050 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16060 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16070 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16080 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
16090 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
160a0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
160b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
160c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
160d0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
160e0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
160f0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
16100 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
16110 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
16120 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
16130 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
16140 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
16150 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
16160 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
16170 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
16180 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
16190 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
161a0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
161b0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
161c0 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
161d0 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
161e0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
161f0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
16200 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
16210 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
16220 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
16230 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
16240 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
16250 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
16260 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
16270 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
16280 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
16290 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
162a0 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
162b0 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
162c0 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
162d0 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
162e0 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
162f0 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
16300 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
16310 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
16320 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
16330 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
16340 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
16350 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
16360 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
16370 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
16380 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
16390 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
163a0 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
163b0 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
163c0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
163d0 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
163e0 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
163f0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
16400 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
16410 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
16420 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
16430 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
16440 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
16450 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
16460 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
16470 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
16480 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
16490 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
164a0 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
164b0 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
164c0 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
164d0 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
164e0 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
164f0 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
16500 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
16510 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
16520 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
16530 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
16540 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
16550 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
16560 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
16570 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
16580 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
16590 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
165a0 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
165b0 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
165c0 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
165d0 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
165e0 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
165f0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
16600 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
16610 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
16620 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
16630 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
16640 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
16650 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
16660 73 74 61 74 75 73 3b 0a 7d 0a                    status;.}.