Hex Artifact Content

Artifact 26178e45e1afd446fca1c61686720eaccedfe9b34dba06d6926e548a7e8d4ac3:


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 28 6f 6b 29 3b 09 2f 2a    return(ok);./*
2f90: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61   By default, lea
2fa0: 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ve verification 
2fb0: 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a  unchanged. */.}.
2fc0: 0c 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a  ----------. *. *
3010: 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a   Tls_Error --. *
3020: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3030: 63 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20  ck with list of 
3040: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69  errors.. *. * Si
3050: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
3060: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
3070: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
3080: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
3090: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
30a0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
30b0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
30c0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
30d0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3120: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28  .void.Tls_Error(
3130: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
3140: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20   char *msg) {.  
3150: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3160: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3170: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3180: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c  _Obj *cmdPtr, *l
3190: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69  istPtr;.    unsi
31a0: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20  gned long err;. 
31b0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
31c0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72   = msg;..    dpr
31d0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
31e0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
31f0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
3200: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
3210: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  return;..    /* 
3220: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3230: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
3240: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67  chan, and messag
3250: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3260: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3270: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3280: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3290: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
32a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
32d0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
32e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
32f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3300: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
3310: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
3320: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
3330: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3340: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d   -1));.    if (m
3350: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sg != NULL) {..T
3360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3380: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3390: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
33a0: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
33b0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47  if ((msg = Tcl_G
33c0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
33d0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
33e0: 28 69 6e 74 65 72 70 29 2c 20 28 54 63 6c 5f 53  (interp), (Tcl_S
33f0: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 29 20 21 3d  ize *) NULL)) !=
3400: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69   NULL) {..Tcl_Li
3410: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3420: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3430: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3440: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a  Obj(msg, -1));..
3450: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69      } else {..li
3460: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
3470: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
3480: 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20  ..while ((err = 
3490: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29  ERR_get_error())
34a0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   != 0) {..    Tc
34b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
34c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
34d0: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
34e0: 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61  tringObj(ERR_rea
34f0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
3500: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a  (err), -1));..}.
3510: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3530: 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74  , cmdPtr, listPt
3540: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
3550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
3560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
3570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
3580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
3590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
35a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
35b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
35c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
35d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3620: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c   *. * KeyLogCall
3630: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72  back --. *. *.Wr
3640: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79  ite received key
3650: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c   data to log fil
3660: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
3670: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  fects:. *.none. 
3680: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
36d0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28   KeyLogCallback(
36e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
36f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65  const char *line
3700: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74  ) {.    char *st
3710: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45  r = getenv(SSLKE
3720: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46  YLOGFILE);.    F
3730: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70  ILE *fd;..    dp
3740: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
3750: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b  ..    if (str) {
3760: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72  ..fd = fopen(str
3770: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66  , "a");..fprintf
3780: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65  (fd, "%s\n",line
3790: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a  );..fclose(fd);.
37a0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72  --. *. * Passwor
3800: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  d Callback --. *
3810: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20  . *.Called when 
3820: 61 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61  a password for a
3830: 20 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61   private key loa
3840: 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50  ding/storing a P
3850: 45 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74  EM. *.certificat
3860: 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f  e with encryptio
3870: 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63  n. Evals callbac
3880: 6b 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74  k script and ret
3890: 75 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75  urns. *.the resu
38a0: 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f  lt as the passwo
38b0: 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66  rd string in buf
38c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
38d0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
38e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
38f0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
3900: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
3910: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61  * Returns:. *.Pa
3920: 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62  ssword size in b
3930: 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61  ytes or -1 for a
3940: 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d  n error.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
39a0: 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63  .PasswordCallbac
39b0: 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74  k(char *buf, int
39c0: 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61   size, int rwfla
39d0: 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20  g, void *udata) 
39e0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
39f0: 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a  tePtr.= (State *
3a00: 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c  ) udata;.    Tcl
3a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
3a20: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
3a30: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
3a40: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
3a50: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69   code;..    dpri
3a60: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
3a70: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c      /* If no cal
3a80: 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75  lback, use defau
3a90: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  lt callback */. 
3aa0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
3ab0: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c  >password == NUL
3ac0: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76  L) {..if (Tcl_Ev
3ad0: 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c  alEx(interp, "tl
3ae0: 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  s::password", -1
3af0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
3b00: 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  L) == TCL_OK) {.
3b10: 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d  .    char *ret =
3b20: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
3b30: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
3b40: 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e  terp);..    strn
3b50: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73  cpy(buf, ret, (s
3b60: 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20  ize_t) size);.. 
3b70: 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73     return (int)s
3b80: 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65  trlen(ret);..} e
3b90: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
3ba0: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  n -1;..}.    }..
3bb0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
3bc0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
3bd0: 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61  th fn, rwflag, a
3be0: 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a  nd size args */.
3bf0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3c00: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3c10: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3c20: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3c30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3c40: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3c50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3c60: 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29  ("password", -1)
3c70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3c80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3c90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3ca0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77  Tcl_NewIntObj(rw
3cb0: 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  flag));.    Tcl_
3cc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3cd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3ce0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
3cf0: 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20  bj(size));..    
3d00: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
3d10: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
3d20: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  );.    Tcl_Prese
3d30: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3d40: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3d50: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
3d60: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
3d70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
3d80: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63  t(cmdPtr);.    c
3d90: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
3da0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
3db0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
3dc0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
3dd0: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de != TCL_OK) {.
3de0: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
3df0: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
3e00: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
3e10: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
3e20: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
3e30: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
3e40: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
3e50: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64  tion(interp, cod
3e60: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
3e70: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3e80: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
3e90: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3ea0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3eb0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3ec0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  If successful, p
3ed0: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72  ass back passwor
3ee0: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75  d string and tru
3ef0: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e  ncate if too lon
3f00: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64  g */.    if (cod
3f10: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
3f20: 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63  Tcl_Size len;..c
3f30: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3f40: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3f50: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74  gFromObj(Tcl_Get
3f60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3f70: 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c  ), &len);..if (l
3f80: 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20  en > (Tcl_Size) 
3f90: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c  size-1) {..    l
3fa0: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20  en = (Tcl_Size) 
3fb0: 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e  size-1;..}..strn
3fc0: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73  cpy(buf, ret, (s
3fd0: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75  ize_t) len);..bu
3fe0: 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09  f[len] = '\0';..
3ff0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
4000: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
4010: 3b 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29 20  ;..return((int) 
4020: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  len);.    }.    
4030: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
4040: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
4050: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
4060: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
40b0: 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c  . * Session Call
40c0: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73  back for Clients
40d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
40e0: 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73   when a new sess
40f0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20  ion is added to 
4100: 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c  the cache. In TL
4110: 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61  S 1.3. *.this ma
4120: 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75  y be received mu
4130: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74  ltiple times aft
4140: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  er the handshake
4150: 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72  . For. *.earlier
4160: 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20   versions, this 
4170: 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64  will be received
4180: 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64   during the hand
4190: 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69  shake.. *.This i
41a0: 73 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20  s the preferred 
41b0: 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  way to obtain a 
41c0: 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  resumable sessio
41d0: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  n.. *. * Results
41e0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
41f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4200: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
4210: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
4220: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
4230: 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68  . *.0 = error wh
4240: 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c  ere session will
4250: 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   be immediately 
4260: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
4270: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e   internal cache.
4280: 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20  . *.1 = success 
4290: 77 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e  where app retain
42a0: 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73  s session in ses
42b0: 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20  sion cache, and 
42c0: 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45  must call SSL_SE
42d0: 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65  SSION_free() whe
42e0: 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  n done.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
4340: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28  SessionCallback(
4350: 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45  SSL *ssl, SSL_SE
4360: 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20  SSION *session) 
4370: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
4380: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
4390: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
43a0: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
43b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
43c0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
43d0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
43e0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
43f0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4400: 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20   char *ticket;. 
4410: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4420: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
4430: 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  id;.    size_t l
4440: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  en2;.    unsigne
4450: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20  d int ulen;..   
4460: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
4470: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
4480: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
4490: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
44a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
44b0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
44c0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
44d0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
44e0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
44f0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4500: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
4510: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
4520: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
4530: 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 73 73  session id, sess
4540: 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64 20  ion ticket, and 
4550: 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 2a 2f  lifetime args */
4560: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4570: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4580: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4590: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
45a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
45b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
45c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
45d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29  j("session", -1)
45e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
45f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4600: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4610: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4620: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4630: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4640: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4650: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
4660: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
4670: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
4680: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
4690: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
46a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
46b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
46c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
46d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
46e0: 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
46f0: 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20  e) ulen));..    
4700: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
4710: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53  t */.    SSL_SES
4720: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
4730: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
4740: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54  t, &len2);.    T
4750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4770: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
4780: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b  yteArrayObj(tick
4790: 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
47a0: 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  en2));..    /* L
47b0: 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72  ifetime - number
47c0: 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20   of seconds */. 
47d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
47e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
47f0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
4800: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e  _NewLongObj((lon
4810: 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  g) SSL_SESSION_g
4820: 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69  et_ticket_lifeti
4830: 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29  me_hint(session)
4840: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
4850: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
4860: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
4870: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
4880: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
4890: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
48a0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
48b0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
48c0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
48d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f   return 0;.}.../
48e0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c  -------. *. * AL
4930: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  PN Callback for 
4940: 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20  Servers and NPN 
4950: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
4960: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65  ents --. *. *.Pe
4970: 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28  rform protocol (
4980: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
4990: 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f  , etc.) selectio
49a0: 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63  n for the. *.inc
49b0: 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  oming connection
49c0: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48  . Called after H
49d0: 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20  ello and server 
49e0: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68  callbacks.. *.Wh
49f0: 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c  ere 'out' is sel
4a00: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
4a10: 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70  nd 'in' is the p
4a20: 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c  eer advertised l
4a30: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ist.. *. * Resul
4a40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4a50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4a60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4a70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
4a80: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
4a90: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
4aa0: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72  _ERR_OK: ALPN pr
4ab0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
4ac0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4ad0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
4ae0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
4af0: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20  RT_FATAL: There 
4b00: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62  was no overlap b
4b10: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e  etween the clien
4b20: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c  t's. *.    suppl
4b30: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ied list and the
4b40: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72   server configur
4b50: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ation. The conne
4b60: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62  ction will be ab
4b70: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c  orted.. *.SSL_TL
4b80: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
4b90: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  ALPN protocol no
4ba0: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e  t selected, e.g.
4bb0: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50  , because no ALP
4bc0: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f  N. *.    protoco
4bd0: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  ls are configure
4be0: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65  d for this conne
4bf0: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ction. The conne
4c00: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
4c10: 0a 20 2a 0a 20 2a 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 2d 2d 2d  ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
4c60: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c  atic int.ALPNCal
4c70: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20  lback(SSL *ssl, 
4c80: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4c90: 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67  har **out, unsig
4ca0: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e  ned char *outlen
4cb0: 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ,..const unsigne
4cc0: 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69  d char *in, unsi
4cd0: 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20  gned int inlen, 
4ce0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
4cf0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4d00: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
4d10: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4d20: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4d30: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4d40: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4d50: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65      int code, re
4d60: 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  s;..    dprintf(
4d70: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
4d80: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
4d90: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
4da0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4db0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4dc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
4dd0: 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  lect protocol */
4de0: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c  .    if (SSL_sel
4df0: 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28  ect_next_proto((
4e00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
4e10: 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73  ) out, outlen, s
4e20: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c  tatePtr->protos,
4e30: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4e40: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65  s_len,..in, inle
4e50: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50  n) == OPENSSL_NP
4e60: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a  N_NEGOTIATED) {.
4e70: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20  ./* Match found 
4e80: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4e90: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4ea0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50   } else {../* OP
4eb0: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45  ENSSL_NPN_NO_OVE
4ec0: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61  RLAP = No overla
4ed0: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20  p, so use first 
4ee0: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74  item from client
4ef0: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a   protocol list *
4f00: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  /..res = SSL_TLS
4f10: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4f20: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
4f30: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
4f40: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4f50: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20  {..return res;. 
4f60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4f70: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4f80: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
4f90: 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69  n, depth, cert i
4fa0: 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73  nfo list, status
4fb0: 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73  , and error args
4fc0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
4fd0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
4fe0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
4ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5000: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5010: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
5020: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5030: 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20  ("alpn", -1));. 
5040: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5050: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5060: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
5070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5080: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
5090: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
50a0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
50b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
50c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
50d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
50e0: 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74  StringObj((const
50f0: 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d   char *) *out, -
5100: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5110: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5120: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5130: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
5140: 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54  Obj(res == SSL_T
5150: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a  LSEXT_ERR_OK));.
5160: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5170: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5180: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5190: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
51a0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
51b0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
51c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
51d0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
51e0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
51f0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5200: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5210: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5220: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5230: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
5240: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5250: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
5260: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
5270: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
5280: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
5290: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  res;.}.../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73  -. *. * Advertis
52f0: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c  e Protocols Call
5300: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72  back for Next Pr
5310: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
5320: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76  on (NPN) in Serv
5330: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a  erHello --. *. *
5340: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54  .called when a T
5350: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20  LS server needs 
5360: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72  a list of suppor
5370: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f  ted protocols fo
5380: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63  r Next. *.Protoc
5390: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a  ol Negotiation..
53a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
53b0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
53c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a  e effects:. *. *
53d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
53e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
53f0: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  _OK: NPN protoco
5400: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
5410: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
5420: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
5430: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e  EXT_ERR_NOACK: N
5440: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
5450: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
5460: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5470: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
54c0: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
54d0: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61  static int.NPNCa
54e0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
54f0: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
5500: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
5510: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  , unsigned int *
5520: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72  outlen, void *ar
5530: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
5540: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
5550: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72  e*)arg;..    dpr
5560: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5570: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
5580: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
5590: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
55a0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
55b0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
55c0: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73  /* Set protocols
55d0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20   list */.    if 
55e0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
55f0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f  s != NULL) {..*o
5600: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70  ut = statePtr->p
5610: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20  rotos;..*outlen 
5620: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
5630: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
5640: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c  se {..*out = NUL
5650: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b  L;..*outlen = 0;
5660: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5670: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5680: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5690: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
56a0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a  K;.}.#endif.../*
56b0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49  ------. *. * SNI
5700: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
5710: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  rvers --. *. *.P
5720: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69  erform server-si
5730: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  de SNI hostname 
5740: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20  selection after 
5750: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78  receiving SNI ex
5760: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c  tension. *.in Cl
5770: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c  ient Hello. Call
5780: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63  ed after hello c
5790: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f  allback but befo
57a0: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  re ALPN callback
57b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
57c0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
57d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
57e0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
57f0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
5800: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
5810: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5820: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  R_OK: SNI hostna
5830: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20  me is accepted. 
5840: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5850: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
5860: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5870: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73  T_FATAL: SNI hos
5880: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5890: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
58a0: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20  ction. *.    is 
58b0: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74  aborted. Default
58c0: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53   for alert is SS
58d0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
58e0: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54  D_NAME.. *.SSL_T
58f0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5900: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73  WARNING: SNI hos
5910: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5920: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61  epted, warning a
5930: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74  lert. *.    sent
5940: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20   (not supported 
5950: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65  in TLSv1.3). The
5960: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
5970: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5980: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5990: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
59a0: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64  not accepted and
59b0: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65   not acknowledge
59c0: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69  d,. *.    e.g. i
59d0: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65  f SNI has not be
59e0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54  en configured. T
59f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5a00: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a50: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
5a60: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .SNICallback(con
5a70: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
5a80: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
5a90: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5aa0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5ab0: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
5ac0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
5ad0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
5ae0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
5af0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
5b00: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
5b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76  const char *serv
5b20: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  ername = NULL;..
5b30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5b40: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
5b50: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
5b60: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
5b70: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5b80: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5b90: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77  }..    /* Only w
5ba0: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32  orks for TLS 1.2
5bb0: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a   and earlier */.
5bc0: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
5bd0: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
5be0: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
5bf0: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
5c00: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65  me);.    if (!se
5c10: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76  rvername || serv
5c20: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30  ername[0] == '\0
5c30: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ') {..return SSL
5c40: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5c50: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
5c60: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
5c70: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
5c80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5c90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5cb0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
5cc0: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
5cd0: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20  han, and server 
5ce0: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  name args */.   
5cf0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
5d00: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
5d10: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
5d20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5d30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5d40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5d50: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c  StringObj("sni",
5d60: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5d70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5d80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5d90: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
5da0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
5db0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
5dc0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
5dd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5de0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5df0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5e00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5e10: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
5e20: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
5e30: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
5e40: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
5e50: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5e60: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
5e70: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
5e80: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5e90: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
5ea0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5eb0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57  SEXT_ERR_ALERT_W
5ec0: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20  ARNING;..*alert 
5ed0: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
5ee0: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
5ef0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
5f00: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
5f10: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5f20: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5f30: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5f40: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
5f50: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5f60: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
5f70: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
5f80: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5f90: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
5fa0: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
5fb0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   */.    }.    Tc
5fc0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
5fd0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
5fe0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
5ff0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6030: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e  ----. *. * Clien
6040: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65  tHello Handshake
6050: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
6060: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55  rvers --. *. *.U
6070: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f  sed by server to
6080: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72   examine the ser
6090: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
60a0: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73  ion (SNI) extens
60b0: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20  ion. *.provided 
60c0: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e  by the client in
60d0: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74   order to select
60e0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
60f0: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20  certificate to. 
6100: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d  *.present, and m
6110: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67  ake other config
6120: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65  uration adjustme
6130: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20  nts relevant to 
6140: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e  that server. *.n
6150: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66  ame and its conf
6160: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iguration. This 
6170: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e  includes swappin
6180: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69  g out the associ
6190: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20  ated. *.SSL_CTX 
61a0: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69  pointer, modifyi
61b0: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
61c0: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65  list of permitte
61d0: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a  d TLS versions,.
61e0: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20   *.changing the 
61f0: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20  server's cipher 
6200: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65  list in response
6210: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73   to the client's
6220: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74   cipher list, et
6230: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66  c.. *.Called bef
6240: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e  ore SNI and ALPN
6250: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20   callbacks.. *. 
6260: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
6270: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
6280: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
6290: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
62a0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
62b0: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
62c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
62d0: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65  TRY: suspend the
62e0: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20   handshake, and 
62f0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75  the handshake fu
6300: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
6310: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  rn immediately. 
6320: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
6330: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72  LO_ERROR: failur
6340: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e  e, terminate con
6350: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65  nection. Set ale
6360: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65  rt to error code
6370: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  .. *.SSL_CLIENT_
6380: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73  HELLO_SUCCESS: s
6390: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  uccess. *. *----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
63e0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48   */.static int.H
63f0: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c  elloCallback(SSL
6400: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
6410: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
6420: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6430: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
6440: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
6450: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
6460: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
6470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
6480: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
6490: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
64a0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
64b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
64c0: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
64d0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65    size_t len, re
64e0: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70  maining;..    dp
64f0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6500: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
6510: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
6520: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
6530: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6540: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
6550: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
6560: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c  sl == (const SSL
6570: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d   *)NULL || arg =
6580: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20  = (void *)NULL) 
6590: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
65a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
65b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
65c0: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  Get names */.   
65d0: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74   if (!SSL_client
65e0: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28  _hello_get0_ext(
65f0: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45  ssl, TLSEXT_TYPE
6600: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70  _server_name, &p
6610: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c  , &remaining) ||
6620: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29   remaining <= 2)
6630: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6640: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
6650: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
6660: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6670: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6690: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
66a0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
66b0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
66c0: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
66d0: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
66e0: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
66f0: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
6700: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
6710: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6720: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
6730: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
6740: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6750: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6760: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6770: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20  ing = len;..    
6780: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70  /* The list in p
6790: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73  ractice only has
67a0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
67b0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f  t, so we only co
67c0: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74  nsider the first
67d0: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20   one. */.    if 
67e0: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20  (remaining == 0 
67f0: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58  || *p++ != TLSEX
6800: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
6810: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20  name) {..*alert 
6820: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6830: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6840: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6850: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6860: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
6870: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20  maining--;..    
6880: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69  /* Now we can fi
6890: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74  nally pull out t
68a0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69  he byte array wi
68b0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f  th the actual ho
68c0: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69  stname. */.    i
68d0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  f (remaining <= 
68e0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
68f0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6900: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6910: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6920: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6930: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
6940: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6950: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6960: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6970: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20   2 > remaining) 
6980: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6990: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
69a0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
69b0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
69c0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
69d0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
69e0: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72  g = len;.    ser
69f0: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  vername = (const
6a00: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20   char *)p;..    
6a10: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
6a20: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
6a30: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72  n, chan, and ser
6a40: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f  ver name args */
6a50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
6a60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
6a70: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
6a80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6a90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6aa0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
6ab0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68  _NewStringObj("h
6ac0: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  ello", -1));.   
6ad0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6ae0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6af0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
6b00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6b10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
6b20: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
6b30: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
6b40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6b50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6b60: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6b70: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
6b80: 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  me, (Tcl_Size) l
6b90: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
6ba0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6bb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6bc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6bd0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6be0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6bf0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6c00: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6c10: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6c20: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6c30: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6c40: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
6c50: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
6c60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
6c70: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
6c80: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6c90: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
6ca0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6cb0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6cc0: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6cd0: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6ce0: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6cf0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6d00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6d10: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6d20: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d40: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6d50: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6d70: 0a 0a 2f 2a 0a 20 2a 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 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6dc0: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6dd0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6de0: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6df0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6e00: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6e10: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6e20: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6e30: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6e40: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6e50: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6e60: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6e70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6e80: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6e90: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6ea0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6eb0: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6ec0: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6ed0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6f30: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6f40: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
6f50: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31  ", "ssl3", "tls1
6f60: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ", "tls1.1", "tl
6f70: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c  s1.2", "tls1.3",
6f80: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72   NULL.};.enum pr
6f90: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53  otocol {.    TLS
6fa0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
6fb0: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54   TLS_TLS1, TLS_T
6fc0: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_1, TLS_TLS1_
6fd0: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54  2, TLS_TLS1_3, T
6fe0: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74  LS_NONE.};..stat
6ff0: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
7000: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
7010: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
7020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7030: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
7040: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
7050: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
7060: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
7070: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
7080: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
7090: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
70a0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
70b0: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
70c0: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46  har *cp, buf[BUF
70d0: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e  SIZ];.    int in
70e0: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30  dex, verbose = 0
70f0: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20  , use_supported 
7100: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  = 0;.    const S
7110: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
7120: 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  d;.    (void) cl
7130: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
7140: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
7150: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ;..    if ((objc
7160: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e   < 2) || (objc >
7170: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   4)) {..Tcl_Wron
7180: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
7190: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f   1, objv, "proto
71a0: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73  col ?verbose? ?s
71b0: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65  upported?");..re
71c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
71d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63      }.    if (Tc
71e0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
71f0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
7200: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70  ], protocols, "p
7210: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e  rotocol", 0, &in
7220: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
7230: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
7240: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
7250: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26  f ((objc > 2) &&
7260: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
7270: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7280: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65  bjv[2], &verbose
7290: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
72a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
72b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
72c0: 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63  (objc > 3) && Tc
72d0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
72e0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
72f0: 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72  [3], &use_suppor
7300: 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ted) != TCL_OK) 
7310: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
7320: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7330: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
7340: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28  );..    switch (
7350: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69  (enum protocol)i
7360: 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c  ndex) {..case TL
7370: 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e  S_SSL2:.#if OPEN
7380: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
7390: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30  ER >= 0x10100000
73a0: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f  L || defined(NO_
73b0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL2) || defined
73c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
73d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
73e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
73f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7400: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7410: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7420: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7440: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7450: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20  SSLv2_method(); 
7460: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7470: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69  ase TLS_SSL3:.#i
7480: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
7490: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
74a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c  ENSSL_NO_SSL3) |
74b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
74c0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
74d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
74e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
74f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7500: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7510: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7520: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7530: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7540: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7550: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20  SSLv3_method(); 
7560: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7570: 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69  ase TLS_TLS1:.#i
7580: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
7590: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
75a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c  ENSSL_NO_TLS1) |
75b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
75c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
75d0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
75e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
75f0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7600: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7610: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7620: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7630: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7640: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7650: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20  TLSv1_method(); 
7660: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7670: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a  ase TLS_TLS1_1:.
7680: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7690: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
76a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
76b0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
76c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
76d0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
76e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
76f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7700: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7710: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7720: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
7730: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7740: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7750: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f  ethod = TLSv1_1_
7760: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7770: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7780: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65  S_TLS1_2:.#if de
7790: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
77a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
77b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
77c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
77d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
77e0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
77f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7800: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
7810: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
7820: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7830: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
7840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7850: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7860: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64  = TLSv1_2_method
7870: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7880: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7890: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _3:.#if defined(
78a0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
78b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
78c0: 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63  _TLS1_3)..    Tc
78d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
78e0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
78f0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7900: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7910: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
7920: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7930: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
7940: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f  thod = TLS_metho
7950: 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  d();..    SSL_CT
7960: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
7970: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
7980: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20  1_3_VERSION);.. 
7990: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
79a0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
79b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
79c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61  SION);..    brea
79d0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75  k;.#endif..defau
79e0: 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lt:..    method 
79f0: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a  = TLS_method();.
7a00: 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  .    break;.    
7a10: 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  }..    ctx = SSL
7a20: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
7a30: 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d  ;.    if (ctx ==
7a40: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
7a50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7a60: 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  p, GET_ERR_REASO
7a70: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  N(), NULL);..ret
7a80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7a90: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20     }..    ssl = 
7aa0: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20  SSL_new(ctx);.  
7ab0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
7ac0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7ad0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7ae0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7af0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
7b00: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
7b10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7b20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
7b30: 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20   list and order 
7b40: 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74  as would be sent
7b50: 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c   in a ClientHell
7b60: 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62  o or all availab
7b70: 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20  le ciphers */.  
7b80: 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72    if (use_suppor
7b90: 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c  ted) {..sk = SSL
7ba0: 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f  _get1_supported_
7bb0: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20  ciphers(ssl);.  
7bc0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d    } else {..sk =
7bd0: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73   SSL_get_ciphers
7be0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  (ssl);.    }..  
7bf0: 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c    if (sk != NULL
7c00: 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73  ) {..if (!verbos
7c10: 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72  e) {..    objPtr
7c20: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
7c30: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  j(0, NULL);..   
7c40: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7c50: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7c60: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7c70: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7c80: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7c90: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7ca0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7cb0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7cc0: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e  ;..../* cipher n
7cd0: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f  ame or (NONE) */
7ce0: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48  ...cp = SSL_CIPH
7cf0: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a  ER_get_name(c);.
7d00: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c  ..if (cp == NULL
7d10: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c  ) break;...Tcl_L
7d20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7d30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
7d40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
7d50: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09  gObj(cp, -1));..
7d60: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b      }...} else {
7d70: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
7d80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7d90: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20  "",0);..    for 
7da0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
7db0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75  sk_SSL_CIPHER_nu
7dc0: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09  m(sk); i++) {...
7dd0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52  const SSL_CIPHER
7de0: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50   *c = sk_SSL_CIP
7df0: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29  HER_value(sk, i)
7e00: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c  ;...if (c == NUL
7e10: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09  L) continue;....
7e20: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72  /* textual descr
7e30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
7e40: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53  pher */...if (SS
7e50: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70  L_CIPHER_descrip
7e60: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a  tion(c, buf, siz
7e70: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c  eof(buf)) != NUL
7e80: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41  L) {...    Tcl_A
7e90: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74  ppendToObj(objPt
7ea0: 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a  r, buf, (Tcl_Siz
7eb0: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b  e) strlen(buf));
7ec0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
7ed0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
7ee0: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f  j(objPtr, "UNKNO
7ef0: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09  WN\n", 8);...}..
7f00: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73      }..}..if (us
7f10: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
7f20: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45      sk_SSL_CIPHE
7f30: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20  R_free(sk);..}. 
7f40: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65     }.    SSL_fre
7f50: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f  e(ssl);.    SSL_
7f60: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a  CTX_free(ctx);..
7f70: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7f80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
7f90: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
7fa0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
7fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74  -----. *. * Prot
8000: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c  ocolsObjCmd -- l
8010: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72  ist available pr
8020: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68  otocols. *. *.Th
8030: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
8040: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
8050: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f  ss the "tls::pro
8060: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a  tocols" command.
8070: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
8080: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a  able protocols..
8090: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
80a0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
80b0: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a   result list.. *
80c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
80d0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
8130: 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  t.ProtocolsObjCm
8140: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
8150: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
8160: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
8170: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
8180: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
8190: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
81a0: 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  Ptr;.    (void) 
81b0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
81c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
81d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
81e0: 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57  c != 1) {..Tcl_W
81f0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8200: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
8210: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8220: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8230: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
8240: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
8250: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
8260: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f  0, NULL);..#if O
8270: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
8280: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
8290: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
82a0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
82b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
82c0: 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69  SSL2).    Tcl_Li
82d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
82e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
82f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8300: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
8310: 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23  S_SSL2], -1));.#
8320: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
8330: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
8340: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8350: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
8360: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8370: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20  SSL3_METHOD).   
8380: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8390: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
83a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
83b0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
83c0: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20  cols[TLS_SSL3], 
83d0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
83e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
83f0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
8400: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20  PENSSL_NO_TLS1) 
8410: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8420: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48  SSL_NO_TLS1_METH
8430: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
8440: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
8450: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
8460: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
8470: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
8480: 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  TLS1], -1));.#en
8490: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
84a0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
84b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
84c0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
84d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
84e0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
84f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
8500: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8510: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
8520: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
8530: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8540: 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_1], -1));.#end
8550: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
8560: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
8570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8580: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
8590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
85a0: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
85b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
85c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
85d0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
85e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
85f0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8600: 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _2], -1));.#endi
8610: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8620: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
8630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8640: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c  _TLS1_3).    Tcl
8650: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8660: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
8670: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
8680: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
8690: 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31  [TLS_TLS1_3], -1
86a0: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ));.#endif..    
86b0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
86c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
86d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
86e0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b  -. *. * Handshak
8740: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
8750: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73  .This command is
8760: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
8770: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64  whether the hand
8780: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74  shake is complet
8790: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a  e. *.or not.. *.
87a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
87b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
87c0: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61  sult. 1 means ha
87d0: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65  ndshake complete
87e0: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e  , 0 means pendin
87f0: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  g.. *. * Side ef
8800: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f  fects:. *.May fo
8810: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  rce SSL negotiat
8820: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63  ion to take plac
8830: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8880: 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73  static int Hands
8890: 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  hakeObjCmd(Clien
88a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
88b0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
88c0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
88d0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
88e0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
88f0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20  _Channel chan;  
8900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61        /* The cha
8910: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
8920: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74  de on. */.    St
8930: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20  ate *statePtr;  
8940: 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20        /* client 
8950: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
8960: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  cket */.    cons
8970: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d  t char *errStr =
8980: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
8990: 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  et = 1;.    int 
89a0: 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f  err = 0;.    (vo
89b0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
89c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
89d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
89e0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
89f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
8a00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
8a10: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
8a20: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
8a30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8a40: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8a50: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8a60: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
8a70: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
8a80: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
8a90: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c  (Tcl_Size *) NUL
8aa0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
8ab0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
8ac0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
8ad0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
8ae0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
8af0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8b00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8b10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8b20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8b30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8b40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8b60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8b70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8b80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8b90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8ba0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8bc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8bd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8be0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
8bf0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
8c00: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44  rp, "TLS", "HAND
8c10: 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c  SHAKE", "CHANNEL
8c20: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
8c30: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
8c40: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
8c60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
8c70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
8c80: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
8c90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8ca0: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
8cb0: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20  ForConnect");.  
8cc0: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74    ret = Tls_Wait
8cd0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
8ce0: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20  Ptr, &err, 1);. 
8cf0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f     dprintf("Tls_
8d00: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72  WaitForConnect r
8d10: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65  eturned: %i", re
8d20: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74  t);..    if (ret
8d30: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50   < 0 && ((stateP
8d40: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
8d50: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65  TCL_ASYNC) && (e
8d60: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20  rr == EAGAIN))) 
8d70: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e  {..dprintf("Asyn
8d80: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20  c set and err = 
8d90: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d  EAGAIN");..ret =
8da0: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   0;.    } else i
8db0: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c  f (ret < 0) {..l
8dc0: 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72  ong result;..err
8dd0: 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  Str = statePtr->
8de0: 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52  err;..Tcl_ResetR
8df0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
8e00: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72  Tcl_SetErrno(err
8e10: 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72  );...if (!errStr
8e20: 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20   || (*errStr == 
8e30: 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74  0)) {..    errSt
8e40: 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72  r = Tcl_PosixErr
8e50: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a  or(interp);..}..
8e60: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8e70: 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73  t(interp, "hands
8e80: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  hake failed: ", 
8e90: 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29  errStr, (char *)
8ea0: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65   NULL);..if ((re
8eb0: 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76  sult = SSL_get_v
8ec0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
8ed0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20  tePtr->ssl)) != 
8ee0: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20  X509_V_OK) {..  
8ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8f00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65  lt(interp, " due
8f10: 20 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65   to \"", X509_ve
8f20: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
8f30: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20  string(result), 
8f40: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  "\"", (char *) N
8f50: 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65  ULL);..}..Tcl_Se
8f60: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
8f70: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53  p, "TLS", "HANDS
8f80: 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c  HAKE", "FAILED",
8f90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
8fa0: 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72  ..dprintf("Retur
8fb0: 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77  ning TCL_ERROR w
8fc0: 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61  ith handshake fa
8fd0: 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74  iled: %s", errSt
8fe0: 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  r);..return(TCL_
8ff0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c  ERROR);.    } el
9000: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d  se {..if (err !=
9010: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e   0) {..    dprin
9020: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72  tf("Got an error
9030: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65   with a complete
9040: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72  d handshake: err
9050: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d   = %i", err);..}
9060: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ..ret = 1;.    }
9070: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
9080: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20  eturning TCL_OK 
9090: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22  with data \"%i\"
90a0: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c  ", ret);.    Tcl
90b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
90c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
90d0: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72  Obj(ret));.    r
90e0: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d  eturn(TCL_OK);.}
90f0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a  ----------. *. *
9140: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d   ImportObjCmd --
9150: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
9160: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
9170: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
9180: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  "ssl" command. *
9190: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d  . *.The ssl comm
91a0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f  and pushes SSL o
91b0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e  ver a (newly con
91c0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b  nected) tcp sock
91d0: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  et. *. * Results
91e0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
91f0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
9200: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
9210: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
9220: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
9230: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
9240: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
9290: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d   int.ImportObjCm
92a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
92b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
92c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
92d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
92e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
92f0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
9300: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
9310: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
9320: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
9330: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
9340: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
9350: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
9360: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  */.    SSL_CTX *
9370: 63 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ctx..= NULL;.   
9380: 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74   Tcl_Obj *script
9390: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
93a0: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09  l_Obj *password.
93b0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
93c0: 5f 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55  _Obj *vcmd..= NU
93d0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
93e0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
93f0: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
9400: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9410: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9420: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
9430: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
9440: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54    int idx;.    T
9450: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20  cl_Size len;.   
9460: 20 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54   int flags...= T
9470: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20  LS_TCL_INIT;.   
9480: 20 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20   int server...= 
9490: 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74  0;./* is connect
94a0: 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20  ion incoming or 
94b0: 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20  outgoing? */.   
94c0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09   char *keyfile..
94d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
94e0: 20 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55   *certfile..= NU
94f0: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  LL;.    unsigned
9500: 20 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55   char *key..= NU
9510: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  LL;.    Tcl_Size
9520: 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20   key_len..= 0;. 
9530: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9540: 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a   *cert..= NULL;.
9550: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72      Tcl_Size cer
9560: 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20  t_len..= 0;.    
9570: 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d  char *ciphers..=
9580: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9590: 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d  *ciphersuites..=
95a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
95b0: 2a 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b  *CAfile..= NULL;
95c0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74  .    char *CApat
95d0: 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  h..= NULL;.    c
95e0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d  har *DHparams..=
95f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9600: 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b  *model...= NULL;
9610: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
9620: 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f  rname..= NULL;./
9630: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53  * hostname for S
9640: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63  erver Name Indic
9650: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ation */.    con
9660: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9670: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e   *session_id = N
9680: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9690: 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a   *alpn..= NULL;.
96a0: 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30      int ssl2 = 0
96b0: 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20  , ssl3 = 0;.    
96c0: 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c  int tls1 = 1, tl
96d0: 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32  s1_1 = 1, tls1_2
96e0: 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31   = 1, tls1_3 = 1
96f0: 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20  ;.    int proto 
9700: 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b  = 0, level = -1;
9710: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20  .    int verify 
9720: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30  = 0, require = 0
9730: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70  , request = 1, p
9740: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20  ost_handshake = 
9750: 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  0;.    (void) cl
9760: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
9770: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
9780: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  ;..#if defined(N
9790: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
97a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
97b0: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30  S1).    tls1 = 0
97c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
97d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
97e0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
97f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
9800: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65    tls1_1 = 0;.#e
9810: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
9820: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
9830: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9840: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c  O_TLS1_2).    tl
9850: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_2 = 0;.#endif
9860: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9870: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
9880: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9890: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33  S1_3).    tls1_3
98a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
98b0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
98c0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
98d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
98e0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f  bjv, "channel ?o
98f0: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ptions?");..retu
9900: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9910: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
9920: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
9930: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
9940: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
9950: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9960: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63  Obj(objv[1], (Tc
9970: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c  l_Size *) NULL),
9980: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
9990: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
99a0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
99b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
99c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
99d0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
99e0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
99f0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
9a00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9a10: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
9a20: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20  ;..    for (idx 
9a30: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 2; idx < objc;
9a40: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20   idx++) {..char 
9a50: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *opt = Tcl_GetSt
9a60: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9a70: 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53 69 7a 65  [idx], (Tcl_Size
9a80: 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28   *)NULL);...if (
9a90: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09  opt[0] != '-')..
9aa0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54      break;...OPT
9ab0: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70  OBJ("-alpn", alp
9ac0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  n);..OPTSTR("-ca
9ad0: 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09  dir", CApath);..
9ae0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22  OPTSTR("-cafile"
9af0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42  , CAfile);..OPTB
9b00: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72  YTE("-cert", cer
9b10: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f  t, cert_len);..O
9b20: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65  PTSTR("-certfile
9b30: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f  ", certfile);..O
9b40: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c  PTSTR("-cipher",
9b50: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
9b60: 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63  TR("-ciphers", c
9b70: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9b80: 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22  ("-ciphersuites"
9b90: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b  , ciphersuites);
9ba0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61  ..OPTOBJ("-comma
9bb0: 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f  nd", script);..O
9bc0: 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73  PTSTR("-dhparams
9bd0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f  ", DHparams);..O
9be0: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b  PTBYTE("-key", k
9bf0: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f  ey, key_len);..O
9c00: 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22  PTSTR("-keyfile"
9c10: 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54  , keyfile);..OPT
9c20: 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f  STR("-model", mo
9c30: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  del);..OPTOBJ("-
9c40: 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77  password", passw
9c50: 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ord);..OPTBOOL("
9c60: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22  -post_handshake"
9c70: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
9c80: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
9c90: 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29  quest", request)
9ca0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71  ;..OPTBOOL("-req
9cb0: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b  uire", require);
9cc0: 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72  ..OPTINT("-secur
9cd0: 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65  ity_level", leve
9ce0: 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  l);..OPTBOOL("-s
9cf0: 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b  erver", server);
9d00: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65  ..OPTSTR("-serve
9d10: 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61  rname", serverna
9d20: 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  me);..OPTSTR("-s
9d30: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73  ession_id", sess
9d40: 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f  ion_id);..OPTBOO
9d50: 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29  L("-ssl2", ssl2)
9d60: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
9d70: 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42  3", ssl3);..OPTB
9d80: 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73  OOL("-tls1", tls
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 31 22 2c 20 74 6c 73 31 5f 31 29 3b  ls1.1", tls1_1);
9db0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9dc0: 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f  .2", tls1_2);..O
9dd0: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22  PTBOOL("-tls1.3"
9de0: 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f  , tls1_3);..OPTO
9df0: 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d  BJ("-validatecom
9e00: 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f  mand", vcmd);..O
9e10: 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76  PTOBJ("-vcmd", v
9e20: 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22  cmd);...OPTBAD("
9e30: 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c  option", "-alpn,
9e40: 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65   -cadir, -cafile
9e50: 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69  , -cert, -certfi
9e60: 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69  le, -cipher, -ci
9e70: 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d  phersuites, -com
9e80: 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c  mand, -dhparams,
9e90: 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c   -key, -keyfile,
9ea0: 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f   -model, -passwo
9eb0: 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68  rd, -post_handsh
9ec0: 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d  ake, -request, -
9ed0: 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69  require, -securi
9ee0: 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65  ty_level, -serve
9ef0: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
9f00: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73  -session_id, -ss
9f10: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31  l2, -ssl3, -tls1
9f20: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31  , -tls1.1, -tls1
9f30: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20  .2, -tls1.3, or 
9f40: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
9f50: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
9f60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9f70: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09    if (request)..
9f80: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9f90: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
9fa0: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45   | SSL_VERIFY_PE
9fb0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  ER;.    if (requ
9fc0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09  est && require).
9fd0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9fe0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
9ff0: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69  PEER_CERT;.    i
a000: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
a010: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65  st_handshake).ve
a020: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
a030: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
a040: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66  E;.    if (verif
a050: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20  y == 0)..verify 
a060: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
a070: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
a080: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
a090: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
a0a0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
a0b0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
a0c0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
a0d0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
a0e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
a0f0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
a100: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
a110: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
a120: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a130: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
a140: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
a150: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a160: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
a170: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
a180: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
a190: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
a1a0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
a1b0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
a1c0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
a1d0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
a1e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
a1f0: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
a200: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
a210: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a220: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
a230: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
a240: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
a250: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
a260: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
a270: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
a280: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a290: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
a2a0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
a2b0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
a2c0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a2d0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
a2e0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
a2f0: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
a300: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
a310: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
a320: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
a330: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a340: 20 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26      if (CApath &
a350: 26 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20  & !*CApath).    
a360: 20 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20      CApath.     
a370: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a380: 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21  f (DHparams && !
a390: 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20  *DHparams).     
a3a0: 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20     DHparams     
a3b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20     = NULL;..    
a3c0: 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65  /* new SSL state
a3d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
a3e0: 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b  ..= (State *) ck
a3f0: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29  alloc((unsigned)
a400: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b   sizeof(State));
a410: 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74  .    memset(stat
a420: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ePtr, 0, sizeof(
a430: 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74  State));..    st
a440: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20  atePtr->flags.= 
a450: 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65  flags;.    state
a460: 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e  Ptr->interp.= in
a470: 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50  terp;.    stateP
a480: 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72  tr->vflags.= ver
a490: 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ify;.    statePt
a4a0: 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20  r->err.= "";..  
a4b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63    /* allocate sc
a4c0: 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ript */.    if (
a4d0: 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64  script) {..(void
a4e0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a4f0: 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26  romObj(script, &
a500: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
a510: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
a520: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69  >callback = scri
a530: 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  pt;..    Tcl_Inc
a540: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a550: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
a560: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a570: 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72  allocate passwor
a580: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73  d */.    if (pas
a590: 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29  sword) {..(void)
a5a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a5b0: 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20  omObj(password, 
a5c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a5d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a5e0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73  ->password = pas
a5f0: 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f  sword;..    Tcl_
a600: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a610: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
a620: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a630: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69  /* allocate vali
a640: 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  date command */.
a650: 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a      if (vcmd) {.
a660: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a670: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d  tringFromObj(vcm
a680: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c  d, &len);..if (l
a690: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65  en) {..    state
a6a0: 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64  Ptr->vcmd = vcmd
a6b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
a6c0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a6d0: 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20  ->vcmd);..}.    
a6e0: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c  }..    if (model
a6f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74   != NULL) {..int
a700: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74   mode;../* Get t
a710: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65  he "model" conte
a720: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  xt */..chan = Tc
a730: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
a740: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64  erp, model, &mod
a750: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d  e);..if (chan ==
a760: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
a770: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a780: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a790: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a7a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a7b0: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65  .}.../*.. * Make
a7c0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
a7d0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
a7e0: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68  channel.. */..ch
a7f0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
a800: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69  hannel(chan);..i
a810: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
a820: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
a830: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
a840: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
a850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a860: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
a870: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
a880: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
a890: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
a8a0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
a8b0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
a8c0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
a8d0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
a8e0: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
a8f0: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
a900: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a910: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
a920: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a930: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a940: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
a950: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
a960: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
a970: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
a980: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
a990: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
a9a0: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
a9b0: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
a9c0: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
a9d0: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e  t, (int) key_len
a9e0: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72  ,..    (int) cer
a9f0: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43  t_len, CApath, C
aa00: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
aa10: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
aa20: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
aa30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
aa40: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
aa50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
aa60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aa70: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
aa80: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20    statePtr->ctx 
aa90: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20  = ctx;..    /*. 
aaa0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
aab0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
aac0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b  the channel work
aad0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72  s in binary (for
aae0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72   the.     * encr
aaf0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
ab00: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20  t goofed up)..  
ab10: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e     * We only wan
ab20: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  t to adjust the 
ab30: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65  buffering in pre
ab40: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68  -v2 channels, wh
ab50: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20  ere.     * each 
ab60: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73  channel in the s
ab70: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20  tack maintained 
ab80: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e  its own buffers.
ab90: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
aba0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
abb0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
abc0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
abd0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
abe0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
abf0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
ac00: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
ac10: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
ac20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ac30: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ac40: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
ac50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
ac60: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ac70: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
ac80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
ac90: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
aca0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
acb0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
acc0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
acd0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
ace0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
acf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ad00: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
ad10: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
ad20: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
ad30: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ad40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ad50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
ad60: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
ad70: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
ad80: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ad90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ada0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
adb0: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
adc0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
add0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ade0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
adf0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
ae00: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
ae10: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
ae20: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
ae30: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
ae40: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
ae50: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
ae60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
ae70: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
ae80: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
ae90: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52  tatePtr,..(TCL_R
aea0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
aeb0: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
aec0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
aed0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
aee0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
aef0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
af00: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
af10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
af20: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
af30: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
af40: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
af50: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
af60: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
af70: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
af80: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
af90: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
afa0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
afb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
afc0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
afd0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
afe0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
aff0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
b000: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b010: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b020: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20  Translation));. 
b030: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
b040: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
b050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
b060: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
b070: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
b080: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
b090: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ing));.    Tcl_S
b0a0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
b0b0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
b0c0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61  ->self, "-eofcha
b0d0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
b0e0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
b0f0: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
b100: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
b110: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
b120: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
b130: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
b140: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
b150: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
b160: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  g));..    /*.   
b170: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
b180: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
b190: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
b1a0: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
b1b0: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
b1c0: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
b1d0: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
b1e0: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
b1f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b200: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
b210: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
b220: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f  session: ", GET_
b230: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b240: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b250: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b260: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b270: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e  ", "IMPORT", "IN
b280: 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  IT", "FAILED", (
b290: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b2a0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b2b0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
b2c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b2d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b2e0: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
b2f0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
b300: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
b310: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
b320: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
b330: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
b340: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
b350: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
b360: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
b370: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
b380: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
b390: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
b3a0: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
b3b0: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
b3c0: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
b3d0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b3e0: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
b3f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b400: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b410: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20  t SNI extension 
b420: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b430: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b440: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b450: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b460: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b470: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b480: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b490: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b4a0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b4b0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b4c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b4d0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  RROR;..}.../* Se
b4e0: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70  t hostname for p
b4f0: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  eer certificate 
b500: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63  hostname verific
b510: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73  ation in clients
b520: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20  ...   Don't use 
b530: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69  SSL_set1_host si
b540: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74  nce it has limit
b550: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28  ations. */..if (
b560: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73  !SSL_add1_host(s
b570: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
b580: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20  rvername)) {..  
b590: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b5b0: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69  DNS hostname fai
b5c0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b5d0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b5e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b5f0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b600: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b610: 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41  IMPORT", "HOSTNA
b620: 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ME", "FAILED", (
b630: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b640: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b650: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b660: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b670: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b680: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b690: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b6a0: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b6b0: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b6c0: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b6d0: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b6e0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b6f0: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b700: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b710: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b720: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b730: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
b740: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
b750: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
b760: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
b770: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b780: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b790: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66  Resume session f
b7a0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b7b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b7c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b7d0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b7e0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b7f0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53   "IMPORT", "SESS
b800: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  ION", "FAILED", 
b810: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b820: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
b830: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b840: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b850: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
b860: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  }..    /* Enable
b870: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79   Application-Lay
b880: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  er Protocol Nego
b890: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65  tiation. Example
b8a0: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c  s are: http/1.0,
b8b0: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20  ..http/1.1, h2, 
b8c0: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70  h3, ftp, imap, p
b8d0: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74  op3, xmpp-client
b8e0: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d  , xmpp-server, m
b8f0: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a  qtt, irc, etc. *
b900: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20  /.    if (alpn) 
b910: 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20  {../* Convert a 
b920: 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  TCL list into a 
b930: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e  protocol-list in
b940: 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a   wire-format */.
b950: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
b960: 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73  protos, *p;..uns
b970: 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73  igned int protos
b980: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53  _len = 0;..Tcl_S
b990: 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74  ize cnt, i;..int
b9a0: 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c   j;..Tcl_Obj **l
b9b0: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c  ist;...if (Tcl_L
b9c0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
b9d0: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20  s(interp, alpn, 
b9e0: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20  &cnt, &list) != 
b9f0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
ba00: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
ba10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
ba20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ba30: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
ba40: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
ba50: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
ba60: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
ba70: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
ba80: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
ba90: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
baa0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
bab0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
bac0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
bad0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
bae0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
baf0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
bb00: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
bb10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f  *) NULL);...Tcl_
bb20: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
bb30: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
bb40: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
bb50: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
bb60: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72   NULL);...Tls_Fr
bb70: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
bb80: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20  ePtr);...return 
bb90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
bba0: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65  }..    protos_le
bbb0: 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c  n += 1 + (int) l
bbc0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c  en;..}.../* Buil
bbd0: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70  d the complete p
bbe0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bbf0: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f  .protos = ckallo
bc00: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09  c(protos_len);..
bc10: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  /* protocol-list
bc20: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62  s consist of 8-b
bc30: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78  it length-prefix
bc40: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73  ed, byte strings
bc50: 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c   */..for (j = 0,
bc60: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c   p = protos; j <
bc70: 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20   cnt; j++) {..  
bc80: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63    char *str = Tc
bc90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
bca0: 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e  bj(list[j], &len
bcb0: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28  );..    *p++ = (
bcc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c  unsigned char) l
bcd0: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28  en;..    memcpy(
bce0: 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29  p, str, (size_t)
bcf0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d   len);..    p +=
bd00: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53   len;..}.../* SS
bd10: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f  L_set_alpn_proto
bd20: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f  s makes a copy o
bd30: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  f the protocol-l
bd40: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a  ist */../* Note:
bd50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   This functions 
bd60: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74  reverses the ret
bd70: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e  urn value conven
bd80: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c  tion */..if (SSL
bd90: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
bda0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bdb0: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c  protos, protos_l
bdc0: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  en)) {..    Tcl_
bdd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bde0: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70  erp, "Set ALPN p
bdf0: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a  rotocols failed:
be00: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
be10: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
be20: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
be30: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
be40: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
be50: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
be60: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
be70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
be80: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
be90: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b  atePtr);..    ck
bea0: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20  free(protos);.. 
beb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bec0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f  ROR;..}.../* Sto
bed0: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  re protocols lis
bee0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  t */..statePtr->
bef0: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b  protos = protos;
bf00: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bf10: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f  os_len = protos_
bf20: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
bf30: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  {..statePtr->pro
bf40: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61  tos = NULL;..sta
bf50: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
bf60: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
bf70: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
bf80: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a  Callbacks.     *
bf90: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70  /.    SSL_set_ap
bfa0: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d  p_data(statePtr-
bfb0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
bfc0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e  atePtr);./* poin
bfd0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a  t back to us */.
bfe0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
bff0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
c000: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
c010: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
c020: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  SL_set_info_call
c030: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
c040: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  sl, InfoCallback
c050: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62  );..    /* Callb
c060: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e  ack for observin
c070: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  g protocol messa
c080: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ges */.#ifndef O
c090: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52  PENSSL_NO_SSL_TR
c0a0: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20  ACE.    /* void 
c0b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
c0c0: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
c0d0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
c0e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
c0f0: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f     void SSL_CTX_
c100: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c110: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c120: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
c130: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  ; */.    SSL_set
c140: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
c150: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  g(statePtr->ssl,
c160: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c170: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  r);.    SSL_set_
c180: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
c190: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73  tePtr->ssl, Mess
c1a0: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65  ageCallback);.#e
c1b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ndif..    /* Cre
c1c0: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  ate Tcl_Channel 
c1d0: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BIO Handler */. 
c1e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62     statePtr->p_b
c1f0: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  io.= BIO_new_tcl
c200: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e  (statePtr, BIO_N
c210: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61  OCLOSE);.    sta
c220: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f  tePtr->bio.= BIO
c230: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29  _new(BIO_f_ssl()
c240: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76  );..    if (serv
c250: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72  er) {../* Server
c260: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53   callbacks */..S
c270: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c280: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67  t_servername_arg
c290: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c2a0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c2b0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c2c0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c2d0: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  e_callback(state
c2e0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c  Ptr->ctx, SNICal
c2f0: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58  lback);..SSL_CTX
c300: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  _set_client_hell
c310: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  o_cb(statePtr->c
c320: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  tx, HelloCallbac
c330: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c340: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65  Ptr);..if (state
c350: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c360: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
c370: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c  CTX_set_alpn_sel
c380: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c390: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c3a0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c3b0: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53  ePtr);.#ifdef US
c3c0: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74  E_NPN..    if (t
c3d0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c3e0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53  s1_3 == 0) {...S
c3f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
c400: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65  protos_advertise
c410: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  d_cb(statePtr->c
c420: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c  tx, NPNCallback,
c430: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c440: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69  r);..    }.#endi
c450: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65  f..}.../* Enable
c460: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20   server to send 
c470: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74  cert request aft
c480: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c  er handshake (TL
c490: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09  S 1.3 only) */..
c4a0: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61  /* A write opera
c4b0: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70  tion must take p
c4c0: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72  lace for the Cer
c4d0: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74  tificate Request
c4e0: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20   to be..   sent 
c4f0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74  to the client, t
c500: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  his can be done 
c510: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  with SSL_do_hand
c520: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
c530: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c540: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c  _handshake && tl
c550: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c  s1_3) {..    SSL
c560: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
c570: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
c580: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
c590: 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61  .../* set automa
c5a0: 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74  tic curve select
c5b0: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ion */..SSL_set_
c5c0: 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50  ecdh_auto(stateP
c5d0: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f  tr->ssl, 1);.../
c5e0: 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64  * Set server mod
c5f0: 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  e */..statePtr->
c600: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
c610: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65  _SERVER;..SSL_se
c620: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73  t_accept_state(s
c630: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
c640: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
c650: 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73  Client callbacks
c660: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
c670: 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72  PN..if (statePtr
c680: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c  ->protos != NULL
c690: 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20   && tls1_2 == 0 
c6a0: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
c6b0: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
c6c0: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65  et_next_proto_se
c6d0: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
c6e0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
c6f0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c700: 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69  tePtr);..}.#endi
c710: 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63  f.../* Session c
c720: 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43  aching */..SSL_C
c730: 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_set_session_c
c740: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
c750: 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53  tr->ctx, SSL_SES
c760: 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c  S_CACHE_CLIENT |
c770: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
c780: 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52  NO_INTERNAL_STOR
c790: 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73  E);..SSL_CTX_ses
c7a0: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61  s_set_new_cb(sta
c7b0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73  tePtr->ctx, Sess
c7c0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09  ionCallback);...
c7d0: 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68  /* Enable post h
c7e0: 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74  andshake Authent
c7f0: 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f  ication extensio
c800: 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c  n. TLS 1.3 only,
c810: 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a   not http/2. */.
c820: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c830: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
c840: 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70  {..    SSL_set_p
c850: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75  ost_handshake_au
c860: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
c870: 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  , 1);..}.../* Se
c880: 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f  t client mode */
c890: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63  ..SSL_set_connec
c8a0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c8b0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
c8c0: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74    SSL_set_bio(st
c8d0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61  atePtr->ssl, sta
c8e0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74  tePtr->p_bio, st
c8f0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a  atePtr->p_bio);.
c900: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28      BIO_set_ssl(
c910: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73  statePtr->bio, s
c920: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49  tatePtr->ssl, BI
c930: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20  O_NOCLOSE);..   
c940: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f   /*.     * End o
c950: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20  f SSL Init.     
c960: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
c970: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54  Returning %s", T
c980: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
c990: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
c9a0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  ));.    Tcl_SetR
c9b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c9c0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  har *) Tcl_GetCh
c9d0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
c9e0: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56  tr->self), TCL_V
c9f0: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72  OLATILE);..    r
ca00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ca10: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
ca60: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   UnimportObjCmd 
ca70: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
ca80: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
ca90: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
caa0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
cab0: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52   filter.. *. * R
cac0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
cad0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
cae0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
caf0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
cb00: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
cb10: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
cb20: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
cb70: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
cb80: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
cb90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
cba0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cbb0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
cbc0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
cbd0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
cbe0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
cbf0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
cc00: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
cc10: 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  */.    (void) cl
cc20: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
cc30: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
cc40: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
cc50: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
cc60: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
cc70: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
cc80: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
cc90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cca0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ccb0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
ccc0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ccd0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
cce0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
ccf0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
cd00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
cd10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cd20: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
cd30: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cd40: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cd50: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cd60: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cd70: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
cd80: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
cd90: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
cda0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
cdb0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
cdc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cdd0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
cde0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
cdf0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
ce00: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
ce10: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  nnel", NULL);.. 
ce20: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
ce30: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
ce40: 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22  ", "UNIMPORT", "
ce50: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
ce60: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
ce70: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
ce80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ce90: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
cea0: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
ceb0: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45  , chan) == TCL_E
cec0: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20  RROR) {..return 
ced0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cee0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
cef0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf40: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74  -. *. * CTX_Init
cf50: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20   -- construct a 
cf60: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
cf70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
cf80: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43   *.A valid SSL_C
cf90: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e  TX instance or N
cfa0: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ULL.. *. * Side 
cfb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
cfc0: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65  tructs SSL conte
cfd0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
cfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d020: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c  -. */.static SSL
d030: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28  _CTX *.CTX_Init(
d040: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
d050: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69   int isServer, i
d060: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a  nt proto, char *
d070: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  keyfile, char *c
d080: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73  ertfile,.    uns
d090: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c  igned char *key,
d0a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d0b0: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65  cert, int key_le
d0c0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c  n, int cert_len,
d0d0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20   char *CApath,. 
d0e0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c     char *CAfile,
d0f0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20   char *ciphers, 
d100: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
d110: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
d120: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b  har *DHparams) {
d130: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
d140: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
d150: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
d160: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
d170: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
d180: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c  ring ds;.    Tcl
d190: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20  _DString ds1;.  
d1a0: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61    int off = 0, a
d1b0: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  bort = 0;.    in
d1c0: 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  t load_private_k
d1d0: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  ey;.    const SS
d1e0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64  L_METHOD *method
d1f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
d200: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
d210: 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63  f (!proto) {..Tc
d220: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d230: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64  nterp, "no valid
d240: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
d250: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d260: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d270: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
d280: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74   create SSL cont
d290: 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ext */.#if OPENS
d2a0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
d2b0: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c  R >= 0x10100000L
d2c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   || defined(NO_S
d2d0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL2) || defined(
d2e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
d2f0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d300: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d310: 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL2)) {..Tcl_
d320: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d330: 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f  erp, "SSL2 proto
d340: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d350: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
d360: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d370: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d380: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
d390: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
d3a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
d3b0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d3c0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d3d0: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL3)) {..Tcl_A
d3e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d3f0: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63  rp, "SSL3 protoc
d400: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d410: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d420: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d430: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d440: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d450: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
d460: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20  ENSSL_NO_TLS1). 
d470: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d480: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d490: 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  TLS1)) {..Tcl_Ap
d4a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d4b0: 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74  p, "TLS 1.0 prot
d4c0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d4d0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d4e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d4f0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d500: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d510: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
d520: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d530: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_1).    if (ENA
d540: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d550: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b  PROTO_TLS1_1)) {
d560: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d570: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d580: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.1 protocol not
d590: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d5a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d5b0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d5c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d5d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
d5e0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d5f0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
d600: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d610: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d620: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_2)) {..Tcl_Ap
d630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d640: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74  p, "TLS 1.2 prot
d650: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d660: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d670: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d680: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d690: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d6a0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
d6b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d6c0: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_3).    if (ENA
d6d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d6e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b  PROTO_TLS1_3)) {
d6f0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d700: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d710: 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.3 protocol not
d720: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d730: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d740: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28  .#endif.    if (
d760: 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f  proto == 0) {../
d770: 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65  * Use full range
d780: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
d790: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
d7a0: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c  on(ctx, 0);..SSL
d7b0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
d7c0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
d7d0: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  0);.    }..    s
d7e0: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a  witch (proto) {.
d7f0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
d800: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
d810: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
d820: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
d830: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d840: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
d850: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
d860: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L2:..method = is
d870: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73  Server ? SSLv2_s
d880: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d890: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv2_client_me
d8a0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d8b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d8c0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
d8d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d8e0: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
d8f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d900: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
d910: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d920: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL3:..method =
d930: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
d940: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  3_server_method(
d950: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74  ) : SSLv3_client
d960: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d970: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d980: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
d990: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d9a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
d9b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d9c0: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
d9d0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d9e0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f  OTO_TLS1:..metho
d9f0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
da00: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  LSv1_server_meth
da10: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69  od() : TLSv1_cli
da20: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
da30: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
da40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
da50: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
da60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
da70: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
da80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
da90: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
daa0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
dab0: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_1:..method = i
dac0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
dad0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
dae0: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65  ) : TLSv1_1_clie
daf0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
db00: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
db10: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
db20: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
db30: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
db40: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
db50: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
db60: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
db70: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
db80: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  _2:..method = is
db90: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32  Server ? TLSv1_2
dba0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
dbb0: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e   : TLSv1_2_clien
dbc0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
dbd0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
dbe0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
dbf0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
dc00: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
dc10: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
dc20: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a  ROTO_TLS1_3:../*
dc30: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63   Use the generic
dc40: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73   method and cons
dc50: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74  traint range aft
dc60: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72  er context is cr
dc70: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64  eated */..method
dc80: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
dc90: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
dca0: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
dcb0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
dcc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
dcd0: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61  ult:../* Negotia
dce0: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c  te highest avail
dcf0: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72  able SSL/TLS ver
dd00: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  sion */..method 
dd10: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
dd20: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
dd30: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65   : TLS_client_me
dd40: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e  thod();.#if OPEN
dd50: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
dd60: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
dd70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
dd80: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
dd90: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
dda0: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
ddb0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
ddc0: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30  ROTO_SSL2)   ? 0
ddd0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
dde0: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v2);.#endif.#if 
ddf0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
de00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
de10: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09  ENSSL_NO_SSL3)..
de20: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
de30: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
de40: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53  _SSL3)   ? 0 : S
de50: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
de60: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
de70: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
de80: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
de90: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20  L_NO_TLS1)..off 
dea0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
deb0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dec0: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1)   ? 0 : SSL_O
ded0: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e  P_NO_TLSv1);.#en
dee0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
def0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
df00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
df10: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20  NO_TLS1_1)..off 
df20: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
df30: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
df40: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_1) ? 0 : SSL_O
df50: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23  P_NO_TLSv1_1);.#
df60: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
df70: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
df80: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
df90: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66  L_NO_TLS1_2)..of
dfa0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
dfb0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
dfc0: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_2) ? 0 : SSL
dfd0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b  _OP_NO_TLSv1_2);
dfe0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dff0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
e000: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e010: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
e020: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
e030: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e040: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53  _TLS1_3) ? 0 : S
e050: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33  SL_OP_NO_TLSv1_3
e060: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b  );.#endif..break
e070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
e080: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
e090: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
e0a0: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a  TX_new(method);.
e0b0: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a      if (!ctx) {.
e0c0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20  .return(NULL);. 
e0d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65     }..    if (ge
e0e0: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
e0f0: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  LE)) {..SSL_CTX_
e100: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62  set_keylog_callb
e110: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43  ack(ctx, KeyLogC
e120: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
e130: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e140: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
e150: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e160: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
e170: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f  proto == TLS_PRO
e180: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53  TO_TLS1_3) {..SS
e190: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
e1a0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
e1b0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
e1c0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
e1d0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
e1e0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
e1f0: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  SION);.    }.#en
e200: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63  dif..    /* Forc
e210: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69  e cipher selecti
e220: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76  on order by serv
e230: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69  er */.    if (!i
e240: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f  sServer) {..SSL_
e250: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e260: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48  ctx, SSL_OP_CIPH
e270: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52  ER_SERVER_PREFER
e280: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  ENCE);.    }..#i
e290: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
e2a0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
e2b0: 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53  00000L.    OpenS
e2c0: 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72  SL_add_all_algor
e2d0: 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64  ithms(); /* Load
e2e0: 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 67   ciphers and dig
e2f0: 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ests */.#endif..
e300: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e310: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76  app_data(ctx, (v
e320: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a  oid*)interp);./*
e330: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e   remember the in
e340: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20  terpreter */.   
e350: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
e360: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
e370: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53  _ALL);./* all SS
e380: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
e390: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
e3a0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
e3b0: 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50  , SSL_OP_NO_COMP
e3c0: 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73  RESSION);./* dis
e3d0: 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e  able compression
e3e0: 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74   even if support
e3f0: 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ed */.    SSL_CT
e400: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
e410: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73  x, off);../* dis
e420: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65  able protocol ve
e430: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50  rsions */.#if OP
e440: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
e450: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30  MBER < 0x1010100
e460: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  0L.    SSL_CTX_s
e470: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c  et_mode(ctx, SSL
e480: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59  _MODE_AUTO_RETRY
e490: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77  );./* handle new
e4a0: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62   handshakes in b
e4b0: 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79  ackground. On by
e4c0: 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e   default in Open
e4d0: 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65  SSL 1.1.1. */.#e
e4e0: 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58  ndif.    SSL_CTX
e4f0: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
e500: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a  size(ctx, 128);.
e510: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72  .    /* Set user
e520: 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73   defined ciphers
e530: 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c  , cipher suites,
e540: 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65   and security le
e550: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  vel */.    if ((
e560: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
e570: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
e580: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
e590: 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54  , ciphers)) {..T
e5a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e5b0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e5c0: 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20  hers failed: No 
e5d0: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20  valid ciphers", 
e5e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e5f0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e600: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
e610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
e620: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d  (ciphersuites !=
e630: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
e640: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69  TX_set_ciphersui
e650: 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73  tes(ctx, ciphers
e660: 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41  uites)) {..Tcl_A
e670: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e680: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20  rp, "Set cipher 
e690: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e  suites failed: N
e6a0: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22  o valid ciphers"
e6b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e6c0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e6d0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e6e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
e6f0: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Set security l
e700: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
e710: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65  level > -1 && le
e720: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53  vel < 6) {../* S
e730: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_set_security_
e740: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54  level */..SSL_CT
e750: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  X_set_security_l
e760: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29  evel(ctx, level)
e770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e780: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63  set some callbac
e790: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ks */.    SSL_CT
e7a0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
e7b0: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73  sswd_cb(ctx, Pas
e7c0: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a  swordCallback);.
e7d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e7e0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
e7f0: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20  b_userdata(ctx, 
e800: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
e810: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20  );..    /* read 
e820: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e  a Diffie-Hellman
e830: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
e840: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69  , or use the bui
e850: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66  lt-in one */.#if
e860: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
e870: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
e880: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
e890: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e8a0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
e8b0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
e8c0: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
e8d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
e8e0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e8f0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
e900: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
e910: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
e920: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
e930: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
e940: 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  o;..    Tcl_DStr
e950: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20  ingInit(&ds);.. 
e960: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77     bio = BIO_new
e970: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61  _file(F2N(DHpara
e980: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a  ms, &ds), "r");.
e990: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b  .    if (!bio) {
e9a0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
e9b0: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41  ee(&ds);...Tcl_A
e9c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e9d0: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66  rp, "Could not f
e9e0: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72  ind DH parameter
e9f0: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  s file", (char *
ea00: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
ea10: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
ea20: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
ea30: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50    }...    dh = P
ea40: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61  EM_read_bio_DHpa
ea50: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20  rams(bio, NULL, 
ea60: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  NULL, NULL);..  
ea70: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b    BIO_free(bio);
ea80: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
ea90: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
eaa0: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63   if (!dh) {...Tc
eab0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
eac0: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
ead0: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65  t read DH parame
eae0: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c  ters from file",
eaf0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
eb00: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
eb10: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
eb20: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
eb30: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70   SSL_CTX_set_tmp
eb40: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20  _dh(ctx, dh);.. 
eb50: 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a     DH_free(dh);.
eb60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
eb70: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77  /* Use well know
eb80: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  n DH parameters 
eb90: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d  that have built-
eba0: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70  in support in Op
ebb0: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66  enSSL */..    if
ebc0: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64   (!SSL_CTX_set_d
ebd0: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20  h_auto(ctx, 1)) 
ebe0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
ebf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
ec00: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73  uld not enable s
ec10: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47  et DH auto: ", G
ec20: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
ec30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ec40: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ec50: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ec60: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ULL;..    }..}. 
ec70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
ec80: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74   /* set our cert
ec90: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c  ificate */.    l
eca0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
ecb0: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72  = 0;.    if (cer
ecc0: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  tfile != NULL) {
ecd0: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
ece0: 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53  ey = 1;...Tcl_DS
ecf0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
ed00: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
ed10: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
ed20: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74  le(ctx, F2N(cert
ed30: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
ed40: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
ed50: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44   0) {..    Tcl_D
ed60: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ed70: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ed80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ed90: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
eda0: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22  rtificate file "
edb0: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22  , certfile, ": "
edc0: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53  ,...GET_ERR_REAS
edd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
ede0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
edf0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
ee00: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
ee10: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
ee20: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20   (cert != NULL) 
ee30: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
ee40: 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53  key = 1;..if (SS
ee50: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
ee60: 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20  icate_ASN1(ctx, 
ee70: 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20  cert_len, cert) 
ee80: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
ee90: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
eea0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
eeb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
eec0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
eed0: 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a  certificate: ",.
eee0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
eef0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
ef00: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
ef10: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
ef20: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
ef30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63  .    } else {..c
ef40: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a  ertfile = (char*
ef50: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c  )X509_get_defaul
ef60: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a  t_cert_file();..
ef70: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
ef80: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
ef90: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c  e(ctx, certfile,
efa0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
efb0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30  M) <= 0) {.#if 0
efc0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
efd0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
efe0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eff0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f000: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74  e to use default
f010: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
f020: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
f030: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52  : ",...GET_ERR_R
f040: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
f050: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
f060: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f070: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
f080: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  L;.#endif..}.   
f090: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
f0a0: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
f0b0: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
f0c0: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
f0d0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
f0e0: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
f0f0: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
f100: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
f110: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
f120: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
f130: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
f140: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
f150: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
f160: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
f170: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
f180: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
f190: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
f1a0: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
f1b0: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
f1c0: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
f1d0: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
f1e0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
f1f0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
f200: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f210: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
f220: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
f230: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
f240: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
f250: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
f260: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
f270: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
f280: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f290: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
f2a0: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
f2b0: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
f2c0: 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45  e, " ",...    GE
f2d0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
f2e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f2f0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f300: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f310: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
f320: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f330: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69  &ds);...} else i
f340: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20  f (key != NULL) 
f350: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  {..    if (SSL_C
f360: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
f370: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f  y_ASN1(EVP_PKEY_
f380: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65  RSA, ctx, key,ke
f390: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09  y_len) <= 0) {..
f3a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
f3b0: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
f3c0: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
f3d0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
f3e0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
f3f0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
f400: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
f410: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
f420: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
f430: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
f440: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
f450: 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 52  c key: ", GET_ER
f460: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
f470: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f480: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f490: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f4a0: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f  .    }..}../* No
f4b0: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  w we know that a
f4c0: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61   key and cert ha
f4d0: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69  ve been set agai
f4e0: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20  nst.. * the SSL 
f4f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28  context */..if (
f500: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70  !SSL_CTX_check_p
f510: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29  rivate_key(ctx))
f520: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
f530: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f540: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f   "private key do
f550: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
f560: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62   certificate pub
f570: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20  lic key",....   
f580: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29    (char *) NULL)
f590: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
f5a0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
f5b0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
f5c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
f5d0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
f5e0: 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c  location and fil
f5f0: 65 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74  e for Certificat
f600: 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29  e Authority (CA)
f610: 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 54   certificates. T
f620: 68 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79  he.     * verify
f630: 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20   path and store 
f640: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
f650: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
f660: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54  T_DIR env var. T
f670: 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 63  he verify file c
f680: 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65  an.     * be ove
f690: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
f6a0: 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76  SL_CERT_FILE env
f6b0: 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20   var. */.    if 
f6c0: 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  (!SSL_CTX_set_de
f6d0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74  fault_verify_pat
f6e0: 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72  hs(ctx)) {..abor
f6f0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  t++;.    }..    
f700: 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72  /* Overrides for
f710: 20 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70   the CA verify p
f720: 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a  ath and file */.
f730: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
f740: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 7b 0a  nit(&ds);.    {.
f750: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
f760: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
f770: 30 30 30 30 30 30 30 4c 0a 09 54 63 6c 5f 44 53  0000000L..Tcl_DS
f780: 74 72 69 6e 67 20 64 73 31 3b 0a 09 54 63 6c 5f  tring ds1;..Tcl_
f790: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
f7a0: 29 3b 0a 0a 09 69 66 20 28 43 41 70 61 74 68 20  );...if (CApath 
f7b0: 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c  != NULL || CAfil
f7c0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
f7d0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c    if (!SSL_CTX_l
f7e0: 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74  oad_verify_locat
f7f0: 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41  ions(ctx, F2N(CA
f800: 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28  file, &ds), F2N(
f810: 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 20  CApath, &ds1))) 
f820: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
f830: 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74    }...    /* Set
f840: 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20   list of CAs to 
f850: 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77  send to client w
f860: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61  hen requesting a
f870: 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63   client certific
f880: 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68  ate */..    /* h
f890: 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72  ttps://sourcefor
f8a0: 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67  ge.net/p/tls/bug
f8b0: 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a  s/57/ */..    /*
f8c0: 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74   XXX:TODO: Let t
f8d0: 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76  he user supply v
f8e0: 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65  alues here inste
f8f0: 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20  ad of something 
f900: 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74  that exists on t
f910: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  he filesystem */
f920: 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ..    STACK_OF(X
f930: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
f940: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
f950: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
f960: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
f970: 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e  ;..    if (certN
f980: 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ames != NULL) {.
f990: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
f9a0: 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
f9b0: 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20  , certNames);.. 
f9c0: 20 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 44 53 74     }..}..Tcl_DSt
f9d0: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
f9e0: 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61  .#else..if (CApa
f9f0: 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  th != NULL) {.. 
fa00: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
fa10: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28  load_verify_dir(
fa20: 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ctx, F2N(CApath,
fa30: 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72   &ds))) {...abor
fa40: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  t++;..    }..}..
fa50: 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55  if (CAfile != NU
fa60: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21  LL) {..    if (!
fa70: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
fa80: 69 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  ify_file(ctx, F2
fa90: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29  N(CAfile, &ds)))
faa0: 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20   {...abort++;.. 
fab0: 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 20 53 65     }...    /* Se
fac0: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f  t list of CAs to
fad0: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20   send to client 
fae0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
faf0: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69  a client certifi
fb00: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 41  cate */..    STA
fb10: 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
fb20: 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53   *certNames = SS
fb30: 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41  L_load_client_CA
fb40: 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65  _file(F2N(CAfile
fb50: 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66  , &ds));..    if
fb60: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e   (certNames != N
fb70: 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58  ULL) {...SSL_CTX
fb80: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _set_client_CA_l
fb90: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d  ist(ctx, certNam
fba0: 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 23  es);..    }..}.#
fbb0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
fbc0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
fbd0: 26 64 73 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  &ds);..    retur
fbe0: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n ctx;.}.../*. *
fbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73  ---. *. * Status
fc40: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
fc50: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
fc60: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e   connected peer.
fc70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
fc80: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
fc90: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
fca0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
fcb0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
fcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fd00: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
fd10: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65  tatusObjCmd(Clie
fd20: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
fd30: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
fd40: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
fd50: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
fd60: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74  objv[]) {.    St
fd70: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
fd80: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
fd90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
fda0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
fdb0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
fdc0: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
fdd0: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
fde0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
fdf0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
fe00: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
fe10: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
fe20: 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b     int nid, res;
fe30: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
fe40: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
fe50: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
fe60: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
fe70: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c  2 || objc > 3 ||
fe80: 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21   (objc == 3 && !
fe90: 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
fea0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ring(objv[1]), "
feb0: 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63  -local"))) {..Tc
fec0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fed0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
fee0: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65  "?-local? channe
fef0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
ff00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ff10: 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65     /* Get channe
ff20: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e  l Id */.    chan
ff30: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
ff40: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
ff50: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f  bjv[(objc == 2 ?
ff60: 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 6c 5f 53   1 : 2)], (Tcl_S
ff70: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  ize *) NULL);.  
ff80: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
ff90: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
ffa0: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
ffb0: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
ffc0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
ffd0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
ffe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
10000 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
10010 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
10020 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
10030 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
10040 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
10050 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
10060 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
10070 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
10080 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
10090 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
100a0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
100b0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
100c0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
100d0 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
100e0 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
100f0 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
10100 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
10110 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e   "STATUS", "CHAN
10120 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
10130 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
10140 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
10150 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  OR;.    }.    st
10160 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
10170 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
10180 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
10190 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  an);..    /* Get
101a0 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
101b0 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f   peer or self */
101c0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
101d0 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53   2) {..peer = SS
101e0 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69  L_get_peer_certi
101f0 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
10200 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
10210 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  e {..peer = SSL_
10220 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28  get_certificate(
10230 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10240 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74      }.    /* Get
10250 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74   X509 certificat
10260 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  e info */.    if
10270 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74   (peer) {..objPt
10280 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  r = Tls_NewX509O
10290 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29  bj(interp, peer)
102a0 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32  ;..if (objc == 2
102b0 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72  ) {..    X509_fr
102c0 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70  ee(peer);..    p
102d0 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eer = NULL;..}. 
102e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a     } else {..obj
102f0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
10300 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
10310 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65     }..    /* Pee
10320 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41  r name */.    LA
10330 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10340 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e  , objPtr, "peern
10350 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70  ame", SSL_get0_p
10360 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72  eername(statePtr
10370 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20  ->ssl), -1);.   
10380 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
10390 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62  erp, objPtr, "sb
103a0 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69  its", SSL_get_ci
103b0 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50  pher_bits(stateP
103c0 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b  tr->ssl, NULL));
103d0 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20  ..    ciphers = 
103e0 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63  (char*)SSL_get_c
103f0 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
10400 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  ssl);.    LAPPEN
10410 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10420 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20  jPtr, "cipher", 
10430 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20  ciphers, -1);.. 
10440 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65     /* Verify the
10450 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74   X509 certificat
10460 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74  e presented by t
10470 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c  he peer */.    L
10480 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10490 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
104a0 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39  fyResult",..X509
104b0 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
104c0 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
104d0 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
104e0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c  statePtr->ssl)),
104f0 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65   -1);..    /* Ve
10500 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  rify mode */.   
10510 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f   mode = SSL_get_
10520 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74  verify_mode(stat
10530 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10540 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10550 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09  VERIFY_NONE) {..
10560 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10570 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
10580 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22  ifyMode", "none"
10590 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73  , -1);.    } els
105a0 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69  e {..Tcl_Obj *li
105b0 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e  stObjPtr = Tcl_N
105c0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
105d0 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  L);..if (mode &&
105e0 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
105f0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
10600 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10610 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
10620 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10630 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d  ingObj("peer", -
10640 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
10650 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10660 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
10670 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c  CERT) {..    Tcl
10680 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10690 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
106a0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
106b0 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c  wStringObj("fail
106c0 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74   if no peer cert
106d0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
106e0 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
106f0 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29  IFY_CLIENT_ONCE)
10700 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
10710 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10720 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
10730 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10740 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e  ngObj("client on
10750 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  ce", -1));..}..i
10760 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
10770 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53  ERIFY_POST_HANDS
10780 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  HAKE) {..    Tcl
10790 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
107a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
107b0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
107c0 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74  wStringObj("post
107d0 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29   handshake", -1)
107e0 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f  );..}..LAPPEND_O
107f0 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
10800 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c  r, "verifyMode",
10810 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20   listObjPtr).   
10820 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66   }..    /* Verif
10830 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a  y mode depth */.
10840 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
10850 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10860 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53  "verifyDepth", S
10870 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_get_verify_de
10880 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  pth(statePtr->ss
10890 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70  l));..    /* Rep
108a0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
108b0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
108c0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67  esult of the neg
108d0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  otiation */.    
108e0 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  SSL_get0_alpn_se
108f0 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d  lected(statePtr-
10900 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  >ssl, &proto, &l
10910 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  en);.    LAPPEND
10920 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10930 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
10940 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c  ar *)proto, (Tcl
10950 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20  _Size) len);.   
10960 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
10970 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
10980 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
10990 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74  _version(statePt
109a0 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20  r->ssl), -1);.. 
109b0 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
109c0 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
109d0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
109e0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
109f0 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
10a00 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
10a10 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
10a20 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
10a30 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
10a40 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  = SSL_get_signat
10a50 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
10a60 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
10a70 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
10a80 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20  ) {nid = 0;}.   
10a90 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
10aa0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69  erp, objPtr, "si
10ab0 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72  gnatureHashAlgor
10ac0 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ithm", OBJ_nid2l
10ad0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
10ae0 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
10af0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
10b00 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
10b10 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
10b20 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
10b30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
10b40 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
10b50 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73  ature_type_nid(s
10b60 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
10b70 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
10b80 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
10b90 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
10ba0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10bb0 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79  tr, "signatureTy
10bc0 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  pe", OBJ_nid2ln(
10bd0 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  nid), -1);..    
10be0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10bf0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
10c00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10c10 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
10c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c60 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69  -. *. * Connecti
10c70 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20  onInfoObjCmd -- 
10c80 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f  return connectio
10c90 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e  n info from Open
10ca0 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  SSL.. *. * Resul
10cb0 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66  ts:. *.A list of
10cc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10cd0 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  *. *---------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
10d20 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65  static int Conne
10d30 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28  ctionInfoObjCmd(
10d40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
10d50 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
10d60 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
10d70 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
10d80 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
10d90 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10da0 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
10db0 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
10dc0 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74  e on */.    Stat
10dd0 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
10de0 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
10df0 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
10e00 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
10e10 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20  Ptr, *listPtr;. 
10e20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
10e30 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
10e40 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
10e50 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
10e60 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
10e70 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
10e80 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64  D *md;.    (void
10e90 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
10ea0 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
10eb0 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
10ec0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
10ed0 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
10ee0 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
10ef0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
10f00 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10f10 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
10f20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10f30 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54  mObj(objv[1], (T
10f40 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c  cl_Size *)NULL),
10f50 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
10f60 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
10f70 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
10f80 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
10f90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10fa0 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
10fb0 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
10fc0 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
10fd0 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
10fe0 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
10ff0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
11000 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
11010 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
11020 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
11030 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11040 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
11050 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
11060 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
11070 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
11080 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
11090 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
110a0 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
110b0 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
110c0 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
110d0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
110e0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
110f0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
11100 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74      }..    objPt
11110 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
11120 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
11130 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
11140 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74  info */.    stat
11150 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
11160 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
11170 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
11180 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74  ;.    ssl = stat
11190 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69  ePtr->ssl;.    i
111a0 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
111b0 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  {../* connection
111c0 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45   state */..LAPPE
111d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
111e0 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20  bjPtr, "state", 
111f0 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
11200 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b  _long(ssl), -1);
11210 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65  .../* Get SNI re
11220 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e  quested server n
11230 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ame */..LAPPEND_
11240 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11250 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22  tr, "servername"
11260 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  , SSL_get_server
11270 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
11280 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
11290 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ame), -1);.../* 
112a0 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  Get protocol */.
112b0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
112c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
112d0 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
112e0 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d  _version(ssl), -
112f0 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74  1);.../* Renegot
11300 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a  iation allowed *
11310 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11320 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11330 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61  "renegotiation_a
11340 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74  llowed", SSL_get
11350 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69  _secure_renegoti
11360 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53  ation_support((S
11370 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f  SL *) ssl));.../
11380 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Get security l
11390 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  evel */..LAPPEND
113a0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
113b0 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c  Ptr, "security_l
113c0 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73  evel", SSL_get_s
113d0 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73  ecurity_level(ss
113e0 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  l));.../* Sessio
113f0 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45  n info */..LAPPE
11400 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11410 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
11420 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65  _reused", SSL_se
11430 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c  ssion_reused(ssl
11440 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76  ));.../* Is serv
11450 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  er info */..LAPP
11460 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11470 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72   objPtr, "is_ser
11480 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72  ver", SSL_is_ser
11490 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  ver(ssl));.../* 
114a0 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50  Is DTLS */..LAPP
114b0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
114c0 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c   objPtr, "is_dtl
114d0 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28  s", SSL_is_dtls(
114e0 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ssl));.    }..  
114f0 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f    /* Cipher info
11500 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d   */.    cipher =
11510 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
11520 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20  _cipher(ssl);.  
11530 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20    if (cipher != 
11540 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
11550 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b  f[BUFSIZ] = {0};
11560 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f  ..int bits, alg_
11570 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65  bits;.../* Ciphe
11580 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
11590 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
115a0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c  bjPtr, "cipher",
115b0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
115c0 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
115d0 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65  );.../* RFC name
115e0 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c   of cipher */..L
115f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11600 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e  p, objPtr, "stan
11610 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f  dard_name", SSL_
11620 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f  CIPHER_standard_
11630 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
11640 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20  );.../* OpenSSL 
11650 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a  name of cipher *
11660 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11670 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11680 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f  openssl_name", O
11690 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61  PENSSL_cipher_na
116a0 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74  me(SSL_CIPHER_st
116b0 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68  andard_name(ciph
116c0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  er)), -1);.../* 
116d0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74  number of secret
116e0 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63   bits used for c
116f0 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d  ipher */..bits =
11700 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
11710 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c  bits(cipher, &al
11720 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e  g_bits);..LAPPEN
11730 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
11740 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69  jPtr, "secret_bi
11750 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50  ts", bits);..LAP
11760 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11770 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69   objPtr, "algori
11780 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62  thm_bits", alg_b
11790 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69  its);../* alg_bi
117a0 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79  ts is actual key
117b0 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66   secret bits. If
117c0 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65   use bits and se
117d0 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29  cret (algorithm)
117e0 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20   bits differ,.. 
117f0 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68    the rest of th
11800 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64  e bits are fixed
11810 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74  , i.e. for limit
11820 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72  ed export cipher
11830 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f  s (bits < 56) */
11840 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20  .../* Indicates 
11850 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72  which SSL/TLS pr
11860 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66  otocol version f
11870 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65  irst defined the
11880 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
11890 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
118a0 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72  objPtr, "min_ver
118b0 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45  sion", SSL_CIPHE
118c0 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69  R_get_version(ci
118d0 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  pher), -1);.../*
118e0 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09   Cipher NID */..
118f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11900 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
11910 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  herNID", (char *
11920 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
11930 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65  CIPHER_get_ciphe
11940 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  r_nid(cipher)), 
11950 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
11960 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11970 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28  , "digestNID", (
11980 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
11990 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
119a0 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68  _digest_nid(ciph
119b0 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  er)), -1);..LAPP
119c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
119d0 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68  objPtr, "keyExch
119e0 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20  angeNID", (char 
119f0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
11a00 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e  _CIPHER_get_kx_n
11a10 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
11a20 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11a30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11a40 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49  authenticationNI
11a50 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
11a60 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
11a70 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63  R_get_auth_nid(c
11a80 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09  ipher)), -1);...
11a90 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65  /* message authe
11aa0 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d  ntication code -
11ab0 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20   Cipher is AEAD 
11ac0 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61  (e.g. GCM or Cha
11ad0 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20  Cha20/Poly1305) 
11ae0 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75  or not */../* Au
11af0 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72  thenticated Encr
11b00 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f  yption with asso
11b10 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41  ciated data (AEA
11b20 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50  D) check */..LAP
11b30 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11b40 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11b50 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f  r_is_aead", SSL_
11b60 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63  CIPHER_is_aead(c
11b70 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69  ipher));.../* Di
11b80 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e 67  gest used during
11b90 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e   the SSL/TLS han
11ba0 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e  dshake when usin
11bb0 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f  g the cipher. */
11bc0 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45  ..md = SSL_CIPHE
11bd0 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f  R_get_handshake_
11be0 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a  digest(cipher);.
11bf0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11c00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61  erp, objPtr, "ha
11c10 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c  ndshake_digest",
11c20 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f   (char *)EVP_MD_
11c30 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a  name(md), -1);..
11c40 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d  ./* Get OpenSSL-
11c50 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74  specific ID, not
11c60 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50   IANA ID */..LAP
11c70 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11c80 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
11c90 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
11ca0 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69  CIPHER_get_id(ci
11cb0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f  pher));.../* Two
11cc0 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e  -byte ID used in
11cd0 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f   the TLS protoco
11ce0 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  l of the given c
11cf0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
11d00 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
11d10 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f  jPtr, "protocol_
11d20 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43  id", (int) SSL_C
11d30 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63  IPHER_get_protoc
11d40 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  ol_id(cipher));.
11d50 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73  ../* Textual des
11d60 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
11d70 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53  cipher */..if (S
11d80 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
11d90 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75  ption(cipher, bu
11da0 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
11db0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
11dc0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11dd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73  rp, objPtr, "des
11de0 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20  cription", buf, 
11df0 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  -1);..}.    }.. 
11e00 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e     /* Session in
11e10 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  fo */.    sessio
11e20 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73  n = SSL_get_sess
11e30 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  ion(ssl);.    if
11e40 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c   (session != NUL
11e50 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
11e60 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
11e70 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b  t;..size_t len2;
11e80 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  ..unsigned int u
11e90 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len;..const unsi
11ea0 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
11eb0 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09  on_id, *proto;..
11ec0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75  unsigned char bu
11ed0 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53  ffer[SSL_MAX_MAS
11ee0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b  TER_KEY_LENGTH];
11ef0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
11f00 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11f10 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11f20 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74  f the ALPN negot
11f30 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53  iation */..SSL_S
11f40 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e  ESSION_get0_alpn
11f50 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f  _selected(sessio
11f60 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32  n, &proto, &len2
11f70 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11f80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11f90 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29  "alpn", (char *)
11fa0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
11fb0 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52  e) len2);.../* R
11fc0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
11fd0 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
11fe0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e   result of the N
11ff0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
12000 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
12010 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f  ..SSL_get0_next_
12020 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64  proto_negotiated
12030 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75  (ssl, &proto, &u
12040 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
12050 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12060 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20  r, "npn", (char 
12070 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53  *) proto, (Tcl_S
12080 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64  ize) ulen);.#end
12090 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  if.../* Resumabl
120a0 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41  e session */..LA
120b0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
120c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75  p, objPtr, "resu
120d0 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53  mable", SSL_SESS
120e0 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
120f0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
12100 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74   Session start t
12110 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e  ime (seconds sin
12120 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41  ce epoch) */..LA
12130 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
12140 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72  p, objPtr, "star
12150 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53  t_time", SSL_SES
12160 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65  SION_get_time(se
12170 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69  ssion));.../* Ti
12180 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53  meout value - SS
12190 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75  L_CTX_get_timeou
121a0 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
121b0 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
121c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
121d0 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53  "timeout", SSL_S
121e0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
121f0 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  ut(session));...
12200 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20  /* Session id - 
12210 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f  TLSv1.2 and belo
12220 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69  w only */..sessi
12230 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
12240 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
12250 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
12260 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12270 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12280 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
12290 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29  n_id, (Tcl_Size)
122a0 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73   ulen);.../* Ses
122b0 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sion context */.
122c0 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53  .session_id = SS
122d0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69  L_SESSION_get0_i
122e0 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f  d_context(sessio
122f0 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  n, &ulen);..LAPP
12300 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12310 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
12320 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65  ion_context", se
12330 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
12340 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a  ize) ulen);.../*
12350 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
12360 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f  - client only */
12370 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
12380 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f  t0_ticket(sessio
12390 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
123a0 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  2);..LAPPEND_BAR
123b0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
123c0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63  tr, "session_tic
123d0 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54  ket", ticket, (T
123e0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
123f0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63  ../* Session tic
12400 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e  ket lifetime hin
12410 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
12420 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
12430 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12440 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f  "lifetime", SSL_
12450 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b  SESSION_get_tick
12460 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74  et_lifetime_hint
12470 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
12480 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61   Ticket app data
12490 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
124a0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
124b0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53   0x30000000L..SS
124c0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74  L_SESSION_get0_t
124d0 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53  icket_appdata((S
124e0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65  SL_SESSION *) se
124f0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
12500 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
12510 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
12520 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f  objPtr, "ticket_
12530 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65  app_data", ticke
12540 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
12550 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  n2);.#endif.../*
12560 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20   Get master key 
12570 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53  */..len2 = SSL_S
12580 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65  ESSION_get_maste
12590 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62  r_key(session, b
125a0 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d  uffer, SSL_MAX_M
125b0 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
125c0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
125d0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
125e0 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c  r, "master_key",
125f0 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69   buffer, (Tcl_Si
12600 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
12610 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a  Compression id *
12620 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  /..unsigned int 
12630 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
12640 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64  _get_compress_id
12650 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50  (session);..LAPP
12660 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12670 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
12680 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20  sion_id", id == 
12690 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f  1 ? "zlib" : "no
126a0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ne", -1);.    }.
126b0 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73  .    /* Compress
126c0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
126d0 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
126e0 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53   {.#ifdef HAVE_S
126f0 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09  SL_COMPRESSION..
12700 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f  const COMP_METHO
12710 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a  D *comp, *expn;.
12720 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f  .comp = SSL_get_
12730 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73  current_compress
12740 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20  ion(ssl);..expn 
12750 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
12760 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29  t_expansion(ssl)
12770 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  ;...LAPPEND_STR(
12780 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12790 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63  "compression", c
127a0 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  omp ? SSL_COMP_g
127b0 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20  et_name(comp) : 
127c0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41  "none", -1);..LA
127d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
127e0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e  , objPtr, "expan
127f0 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53  sion", expn ? SS
12800 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
12810 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  expn) : "none", 
12820 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50  -1);.#else..LAPP
12830 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12840 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
12850 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  sion", "none", -
12860 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
12870 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12880 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e   "expansion", "n
12890 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  one", -1);.#endi
128a0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
128b0 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20  Server info */. 
128c0 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20     {..long mode 
128d0 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65  = SSL_CTX_get_se
128e0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
128f0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
12900 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69  ..char *msg;...i
12910 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12920 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a  SS_CACHE_OFF) {.
12930 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22  .    msg = "off"
12940 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12950 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12960 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20  CHE_CLIENT) {.. 
12970 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74     msg = "client
12980 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12990 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
129a0 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09  ACHE_SERVER) {..
129b0 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65      msg = "serve
129c0 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  r";..} else if (
129d0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
129e0 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20  CACHE_BOTH) {.. 
129f0 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b     msg = "both";
12a00 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
12a10 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  msg = "unknown";
12a20 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  ..}..LAPPEND_STR
12a30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12a40 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f   "session_cache_
12a50 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b  mode", msg, -1);
12a60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
12a70 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a  A List */.    /*
12a80 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72   IF not a server
12a90 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65  , same as SSL_ge
12aa0 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e  t0_peer_CA_list.
12ab0 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20   If server same 
12ac0 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63  as SSL_CTX_get_c
12ad0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f  lient_CA_list */
12ae0 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54  .    listPtr = T
12af0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
12b00 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43   NULL);.    STAC
12b10 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20  K_OF(X509_NAME) 
12b20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66  *ca_list;.    if
12b30 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c   ((ca_list = SSL
12b40 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _get_client_CA_l
12b50 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c  ist(ssl)) != NUL
12b60 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65  L) {..char buffe
12b70 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20  r[BUFSIZ];..for 
12b80 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
12b90 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d  sk_X509_NAME_num
12ba0 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20  (ca_list); i++) 
12bb0 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  {..    X509_NAME
12bc0 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39   *name = sk_X509
12bd0 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c  _NAME_value(ca_l
12be0 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66  ist, i);..    if
12bf0 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39   (name) {...X509
12c00 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61  _NAME_oneline(na
12c10 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  me, buffer, BUFS
12c20 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  IZ);...Tcl_ListO
12c30 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12c40 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
12c50 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12c60 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a  j(buffer, -1));.
12c70 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
12c80 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
12c90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12ca0 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74  "caList", listPt
12cb0 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  r);.    LAPPEND_
12cc0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12cd0 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74  tr, "caListCount
12ce0 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f  ", sk_X509_NAME_
12cf0 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a  num(ca_list));..
12d00 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
12d10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
12d20 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
12d30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
12d40 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d80 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73  -----. *. * Vers
12d90 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  ionObjCmd -- ret
12da0 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69  urn version stri
12db0 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  ng from OpenSSL.
12dc0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
12dd0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
12de0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
12df0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
12e00 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12e50 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56   */.static int.V
12e60 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69  ersionObjCmd(Cli
12e70 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
12e80 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
12e90 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
12ea0 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
12eb0 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
12ec0 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
12ed0 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
12ee0 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64  tData;.    (void
12ef0 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69  ) objc;.    (voi
12f00 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70  d) objv;..    dp
12f10 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
12f20 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
12f30 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12f40 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12f50 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54  TEXT, -1);.    T
12f60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12f70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
12f80 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
12f90 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fe0 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43  -. *. * MiscObjC
12ff0 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61  md -- misc comma
13000 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nds. *. * Result
13010 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
13020 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
13030 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13040 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13090 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
130a0 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69  t.MiscObjCmd(Cli
130b0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
130c0 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
130d0 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
130e0 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
130f0 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73   objv[]) {.    s
13100 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
13110 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20   *commands [] = 
13120 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71  { "req", "strreq
13130 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65  ", NULL };.    e
13140 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f  num command { C_
13150 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43  REQ, C_STRREQ, C
13160 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63  _DUMMY };.    Tc
13170 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20  l_Size cmd;.    
13180 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63  int isStr;.    c
13190 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34  har buffer[16384
131a0 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  ];.    (void) cl
131b0 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
131c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
131d0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
131e0 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  < 2) {..Tcl_Wron
131f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13200 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f   1, objv, "subco
13210 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a  mmand ?args?");.
13220 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13230 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
13240 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
13250 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13260 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20  v[1], commands, 
13270 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63  "command", 0, &c
13280 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  md) != TCL_OK) {
13290 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
132a0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
132b0 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
132c0 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28  ;..    isStr = (
132d0 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29  cmd == C_STRREQ)
132e0 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65  ;.    switch ((e
132f0 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64  num command) cmd
13300 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a  ) {..case C_REQ:
13310 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a  ..case C_STRREQ:
13320 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59   {..    EVP_PKEY
13330 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20   *pkey=NULL;..  
13340 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c    X509 *cert=NUL
13350 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d  L;..    X509_NAM
13360 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20  E *name=NULL;.. 
13370 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73     Tcl_Obj **lis
13380 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a  tv;..    Tcl_Siz
13390 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e  e listc;..    in
133a0 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  t i;...    BIO *
133b0 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
133c0 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
133d0 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
133e0 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
133f0 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
13400 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
13410 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
13420 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
13430 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
13440 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50  ays=365;..#if OP
13450 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13460 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13470 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a  0L..    BIGNUM *
13480 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  bne = NULL;..   
13490 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
134a0 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50  ;.#else..    EVP
134b0 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d  _PKEY_CTX *ctx =
134c0 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09   NULL;.#endif...
134d0 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
134e0 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
134f0 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
13500 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13510 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
13520 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
13530 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
13540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
13550 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
13560 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13570 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13580 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
13590 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
135a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
135b0 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
135c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
135d0 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
135e0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
135f0 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69  objv[4]);..    i
13600 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63  f (isStr) {...Tc
13610 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13620 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09  keyout,"",0);...
13630 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
13640 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,pemout,"",0);.
13650 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
13660 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66  (objc>=6) {...if
13670 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
13680 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
13690 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63   objv[5], &listc
136a0 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c  , &listv) != TCL
136b0 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74  _OK) {...    ret
136c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
136d0 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63  .}....if ((listc
136e0 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20  %2) != 0) {...  
136f0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
13700 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74  interp,"Informat
13710 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61  ion list must ha
13720 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f  ve even number o
13730 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c  f arguments",NUL
13740 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  L);...    return
13750 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
13760 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69  ..for (i=0; i<li
13770 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20  stc; i+=2) {... 
13780 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74     str=Tcl_GetSt
13790 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a  ring(listv[i]);.
137a0 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70  ..    if (strcmp
137b0 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29  (str,"days")==0)
137c0 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
137d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
137e0 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64  rp,listv[i+1],&d
137f0 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ays)!=TCL_OK)...
13800 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13810 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
13820 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13830 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29  tr,"serial")==0)
13840 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
13850 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13860 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73  rp,listv[i+1],&s
13870 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a  erial)!=TCL_OK).
13880 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
13890 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
138a0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
138b0 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a  (str,"C")==0) {.
138c0 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74  ...k_C=Tcl_GetSt
138d0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
138e0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
138f0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53  f (strcmp(str,"S
13900 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53  T")==0) {....k_S
13910 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  T=Tcl_GetString(
13920 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13930 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13940 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30  rcmp(str,"L")==0
13950 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47  ) {....k_L=Tcl_G
13960 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13970 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13980 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13990 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"O")==0) {....
139a0 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_O=Tcl_GetStrin
139b0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
139c0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
139d0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29  strcmp(str,"OU")
139e0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54  ==0) {....k_OU=T
139f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13a00 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13a10 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13a20 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20  p(str,"CN")==0) 
13a30 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65  {....k_CN=Tcl_Ge
13a40 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13a50 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13a60 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13a70 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a  ,"Email")==0) {.
13a80 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47  ...k_Email=Tcl_G
13a90 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13aa0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13ab0 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52  se {....Tcl_SetR
13ac0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e  esult(interp,"Un
13ad0 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22  known parameter"
13ae0 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72  ,NULL);....retur
13af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
13b00 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a     }...}..    }.
13b10 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
13b20 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
13b30 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62  30000000L..    b
13b40 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09  ne = BN_new();..
13b50 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65      rsa = RSA_ne
13b60 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d  w();..    pkey =
13b70 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b   EVP_PKEY_new();
13b80 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d  ..    if (bne ==
13b90 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20   NULL || rsa == 
13ba0 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20  NULL || pkey == 
13bb0 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f  NULL || !BN_set_
13bc0 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29  word(bne,RSA_F4)
13bd0 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72   ||...!RSA_gener
13be0 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20  ate_key_ex(rsa, 
13bf0 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55  keysize, bne, NU
13c00 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  LL) || !EVP_PKEY
13c10 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79  _assign_RSA(pkey
13c20 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f  , rsa)) {...EVP_
13c30 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13c40 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72  .../* RSA_free(r
13c50 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56  sa); freed by EV
13c60 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09  P_PKEY_free */..
13c70 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
13c80 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d  else..    pkey =
13c90 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e   EVP_RSA_gen((un
13ca0 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73  signed int) keys
13cb0 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d  ize);..    ctx =
13cc0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
13cd0 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20  w(pkey,NULL);.. 
13ce0 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e     if (pkey == N
13cf0 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55  ULL || ctx == NU
13d00 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  LL || !EVP_PKEY_
13d10 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29  keygen_init(ctx)
13d20 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f   ||...!EVP_PKEY_
13d30 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67  CTX_set_rsa_keyg
13d40 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79  en_bits(ctx, key
13d50 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b  size) || !EVP_PK
13d60 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26  EY_keygen(ctx, &
13d70 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50  pkey)) {...EVP_P
13d80 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
13d90 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66  ..EVP_PKEY_CTX_f
13da0 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66  ree(ctx);.#endif
13db0 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
13dc0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
13dd0 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
13de0 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
13df0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e00 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
13e10 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
13e20 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
13e30 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
13e40 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
13e50 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
13e60 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
13e70 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
13e80 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
13e90 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
13ea0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
13eb0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
13ec0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
13ed0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
13ee0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13ef0 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72  rp,keyout,buffer
13f00 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
13f10 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
13f20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
13f30 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
13f40 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
13f50 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
13f60 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
13f70 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
13f80 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13f90 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
13fa0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
13fb0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
13fc0 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77  ;...    /* PEM_w
13fd0 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76  rite_bio_RSAPriv
13fe0 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c  ateKey(out, rsa,
13ff0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20   NULL, NULL, 0, 
14000 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a  NULL, NULL); */.
14010 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
14020 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09  ll(out);.. .}...
14030 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f  .if ((cert=X509_
14040 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a  new())==NULL) {.
14050 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
14060 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
14070 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72  r generating cer
14080 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74  tificate request
14090 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45  ",NULL);...    E
140a0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
140b0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
140c0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
140d0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
140e0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
140f0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65  .#endif...    re
14100 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
14110 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74  ...}....X509_set
14120 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29  _version(cert,2)
14130 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52  ;...ASN1_INTEGER
14140 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65  _set(X509_get_se
14150 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
14160 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39  ,serial);...X509
14170 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
14180 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28  _getm_notBefore(
14190 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
141a0 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
141b0 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63  _getm_notAfter(c
141c0 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30  ert),(long)60*60
141d0 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30  *24*days);...X50
141e0 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72  9_set_pubkey(cer
141f0 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65  t,pkey);....name
14200 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63  =X509_get_subjec
14210 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09  t_name(cert);...
14220 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14230 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14240 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"C", MBSTRING_A
14250 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14260 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
14270 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14280 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14290 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
142a0 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
142b0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
142c0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c  ed char *) k_ST,
142d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
142e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
142f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14300 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  L", MBSTRING_ASC
14310 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14320 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
14330 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14340 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14350 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
14360 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14370 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14380 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c  char *) k_O, -1,
14390 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
143a0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
143b0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c  y_txt(name,"OU",
143c0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
143d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
143e0 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c  har *) k_OU, -1,
143f0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14400 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14410 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c  y_txt(name,"CN",
14420 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14430 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14440 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
14450 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14460 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14470 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
14480 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
14490 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
144a0 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69  d char *) k_Emai
144b0 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a  l, -1, -1, 0);..
144c0 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65  ..X509_set_subje
144d0 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d  ct_name(cert,nam
144e0 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39  e);....if (!X509
144f0 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c  _sign(cert,pkey,
14500 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b  EVP_sha256())) {
14510 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  ...    X509_free
14520 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56  (cert);...    EV
14530 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
14540 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
14550 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
14560 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
14570 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
14580 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
14590 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
145a0 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
145b0 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
145c0 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
145d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
145e0 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
145f0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
14600 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
14610 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14620 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
14630 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
14640 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
14650 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
14660 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
14670 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
14680 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
14690 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
146a0 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
146b0 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
146c0 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
146d0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
146e0 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
146f0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
14700 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
14710 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
14720 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
14730 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
14740 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14750 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14760 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
14770 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
14780 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
14790 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
147a0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
147b0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
147c0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42   0x30000000L...B
147d0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
147e0 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  dif..    }..}..b
147f0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
14800 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
14810 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14820 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  OK;.}.../*******
14830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
14840 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20  * Init          
14850 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
14860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
14870 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148b0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
148c0 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Free --. *. *.T
148d0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
148e0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
148f0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
14900 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
14910 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
14920 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
14930 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a  ls below 1. *. *
14940 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
14950 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
14960 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
14970 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
14980 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
149d0 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c  ls_Free(char *bl
149e0 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74  ockPtr) {.    St
149f0 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
14a00 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74  (State *)blockPt
14a10 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
14a20 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
14a30 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50  Tls_Clean(stateP
14a40 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  tr);.    ckfree(
14a50 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
14a60 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14aa0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
14ab0 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
14ac0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
14ad0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
14ae0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
14af0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
14b00 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
14b10 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
14b20 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
14b30 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
14b40 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
14b50 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
14b60 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
14b70 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
14b80 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
14b90 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
14ba0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
14bb0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
14bc0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
14bd0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
14c20 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id Tls_Clean(Sta
14c30 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
14c40 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14c50 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  led");..    /*. 
14c60 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75      * we're assu
14c70 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77  ming here that w
14c80 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65  e're single-thre
14c90 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  aded.     */.   
14ca0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
14cb0 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
14cc0 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
14cd0 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
14ce0 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
14cf0 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
14d00 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
14d10 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
14d20 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
14d30 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73  tos) {..ckfree(s
14d40 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
14d50 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
14d60 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tos = NULL;.    
14d70 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14d80 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54  tr->bio) {../* T
14d90 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53  his will call SS
14da0 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20  L_shutdown. Bug 
14db0 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69  1414045 */..dpri
14dc0 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c  ntf("BIO_free_al
14dd0 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  l(%p)", statePtr
14de0 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65  ->bio);..BIO_fre
14df0 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e  e_all(statePtr->
14e00 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  bio);..statePtr-
14e10 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >bio = NULL;.   
14e20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14e30 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72  Ptr->ssl) {..dpr
14e40 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25  intf("SSL_free(%
14e50 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
14e60 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73  sl);..SSL_free(s
14e70 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
14e80 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
14e90 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
14ea0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74  if (statePtr->ct
14eb0 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  x) {..SSL_CTX_fr
14ec0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ee(statePtr->ctx
14ed0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74  );..statePtr->ct
14ee0 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  x = NULL;.    }.
14ef0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14f00 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54  ->callback) {..T
14f10 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14f20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
14f30 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ck);..statePtr->
14f40 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b  callback = NULL;
14f50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14f60 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
14f70 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
14f80 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
14f90 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61  >password);..sta
14fa0 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
14fb0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14fc0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14fd0 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  vcmd) {..Tcl_Dec
14fe0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
14ff0 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74  tr->vcmd);..stat
15000 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c  ePtr->vcmd = NUL
15010 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  L;.    }..    dp
15020 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
15030 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f  ");.}...#if TCL_
15040 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20  MAJOR_VERSION > 
15050 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45  8.#define MIN_VE
15060 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73  RSION "9.0".#els
15070 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45  e.#define MIN_VE
15080 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64  RSION "8.5".#end
15090 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  if../*. *-------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
150e0 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20   * Tls_Init --. 
150f0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70  *. *.This is a p
15100 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a  ackage initializ
15110 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c  ation procedure,
15120 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64   which is called
15130 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20  . *.by Tcl when 
15140 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20  this package is 
15150 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  to be added to a
15160 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  n interpreter.. 
15170 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53  *. * Results:  S
15180 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  sl configured an
15190 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53  d loaded. *. * S
151a0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
151b0 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20   create the ssl 
151c0 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c  command, initial
151d0 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a  ize ssl context.
151e0 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c  --------. */.DLL
15230 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49  EXPORT int Tls_I
15240 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
15250 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f  interp) {.    co
15260 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
15270 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
15280 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
15290 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d  l.h"..0x00.    }
152a0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
152b0 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65  Called");..#ifde
152c0 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
152d0 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74      if (Tcl_Init
152e0 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49  Stubs(interp, MI
152f0 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d  N_VERSION, 0) ==
15300 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
15310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15320 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
15330 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28  (Tcl_PkgRequire(
15340 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d  interp, "Tcl", M
15350 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
15360 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
15370 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15380 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c   }..    if (TlsL
15390 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c  ibInit(0) != TCL
153a0 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _OK) {..Tcl_Appe
153b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
153c0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74   "could not init
153d0 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61  ialize SSL libra
153e0 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ry", (char *) NU
153f0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
15400 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
15410 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15420 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15430 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20  "tls::ciphers", 
15440 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28  CiphersObjCmd, (
15450 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
15460 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15470 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15480 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15490 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
154a0 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
154b0 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
154c0 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
154d0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
154e0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
154f0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15500 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15510 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15520 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
15530 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c  shakeObjCmd, (Cl
15540 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
15550 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15560 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15570 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15580 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15590 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70  ls::import", Imp
155a0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
155b0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
155c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
155d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
155e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
155f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15600 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
15610 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
15620 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
15630 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15640 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15650 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15660 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15670 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61  ls::status", Sta
15680 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  tusObjCmd, (Clie
15690 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
156a0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
156b0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
156c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
156d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
156e0 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
156f0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ionObjCmd, (Clie
15700 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
15710 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15720 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15730 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15740 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15750 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a  ::misc", MiscObj
15760 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15770 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15780 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15790 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
157a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
157b0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74  terp, "tls::prot
157c0 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c  ocols", Protocol
157d0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
157e0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
157f0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15800 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  ) NULL);..    if
15810 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c   (interp) {..Tcl
15820 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c  _Eval(interp, tl
15830 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b  sTclInitScript);
15840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
15850 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn Tcl_PkgProvid
15860 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47  e(interp, PACKAG
15870 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f  E_NAME, PACKAGE_
15880 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  VERSION);.}../*.
15890 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
158d0 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a  Tls_SafeInit --.
158e0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15910 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64  ------*. *.Stand
15920 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65  ard procedure re
15930 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27  quired by 'load'
15940 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  .. *.Initializes
15950 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20   this extension 
15960 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72  for a safe inter
15970 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d  preter.. *.-----
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
159b0 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
159c0 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f  . *..As of 'Tls_
159d0 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75  Init'. *. *.Resu
159e0 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61  lt:. *..A standa
159f0 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64  rd Tcl error cod
15a00 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a  --------------*.
15a40 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e   */.DLLEXPORT in
15a50 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54  t Tls_SafeInit(T
15a60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15a70 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  p) {.    dprintf
15a80 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20  ("Called");.    
15a90 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28  return(Tls_Init(
15aa0 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a  interp));.}../*.
15ab0 20 2a 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 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
15af0 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a  TlsLibInit --. *
15b00 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b30 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  ----*. *.Initial
15b40 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
15b50 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
15b60 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  ation. *.-------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15ba0 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20  .Side effects:. 
15bb0 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53  *..initializes S
15bc0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a  SL library. *. *
15bd0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e  .Result:. *..non
15be0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
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 2a 0a 20  -------------*. 
15c20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
15c30 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69  sLibInit(int uni
15c40 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20  nitialize) {.   
15c50 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74   static int init
15c60 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20  ialized = 0;.   
15c70 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43   int status = TC
15c80 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  L_OK;.#if define
15c90 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15ca0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15cb0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73  L_THREADS).    s
15cc0 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  ize_t num_locks;
15cd0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
15ce0 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b  (uninitialize) {
15cf0 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a  ..if (!initializ
15d00 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  ed) {..    dprin
15d10 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
15d20 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
15d30 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
15d40 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72  lized");...    r
15d50 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09  eturn(TCL_OK);..
15d60 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b  }...dprintf("Ask
15d70 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
15d80 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ze");..#if defin
15d90 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15da0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15db0 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
15dc0 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
15dd0 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b  _mx);...if (lock
15de0 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c  s) {..    free(l
15df0 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b  ocks);..    lock
15e00 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c  s = NULL;..    l
15e10 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09  ocksCount = 0;..
15e20 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61  }.#endif..initia
15e30 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20  lized = 0;..#if 
15e40 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15e50 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15e60 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15e70 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
15e80 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
15e90 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  dif...return(TCL
15ea0 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _OK);.    }..   
15eb0 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64   if (initialized
15ec0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61  ) {..dprintf("Ca
15ed0 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20  lled, but using 
15ee0 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a  cached value");.
15ef0 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b  .return(status);
15f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
15f10 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
15f20 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15f30 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15f40 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15f50 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74  ADS).    Tcl_Mut
15f60 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
15f70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69  ;.#endif.    ini
15f80 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23  tialized = 1;..#
15f90 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15fa0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15fb0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15fc0 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b  DS).    num_lock
15fd0 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73  s = 1;.    locks
15fe0 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75  Count = (int) nu
15ff0 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63  m_locks;.    loc
16000 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ks = malloc(size
16010 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d  of(*locks) * num
16020 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d  _locks);.    mem
16030 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69  set(locks, 0, si
16040 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
16050 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69  um_locks);.#endi
16060 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  f..    /* Initia
16070 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79  lize BOTH libcry
16080 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20  pto and libssl. 
16090 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69  */.    OPENSSL_i
160a0 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f  nit_ssl(OPENSSL_
160b0 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54  INIT_LOAD_SSL_ST
160c0 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  RINGS | OPENSSL_
160d0 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f  INIT_LOAD_CRYPTO
160e0 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e  _STRINGS..| OPEN
160f0 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
16100 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53  _CIPHERS | OPENS
16110 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
16120 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a  DIGESTS, NULL);.
16130 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  .    BIO_new_tcl
16140 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20  (NULL, 0);..#if 
16150 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  0.    /*.     * 
16160 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65  XXX:TODO: Remove
16170 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72   this code and r
16180 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
16190 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f   check.     * fo
161a0 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79  r enough entropy
161b0 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20   and do not try 
161c0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
161d0 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c  n.     * terribl
161e0 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a  e entropy.     *
161f0 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  /.    /*.     * 
16200 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20  Seed the random 
16210 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
16220 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72   in the SSL libr
16230 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e  ary,.     * usin
16240 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63  g the do/while c
16250 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65  onstruct because
16260 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65   of the bug note
16270 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f   in the.     * O
16280 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74  penSSL FAQ at ht
16290 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c  tp://www.openssl
162a0 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71  .org/support/faq
162b0 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20  .html#USER1.    
162c0 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72   *.     * The cr
162d0 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65  ux of the proble
162e0 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69  m is that Solari
162f0 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  s 7 does not hav
16300 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f  e a.     * /dev/
16310 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75  random or /dev/u
16320 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f  random device so
16330 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65   it cannot gathe
16340 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20  r enough.     * 
16350 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65  entropy from the
16360 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65   RAND_seed() whe
16370 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65  n TLS initialize
16380 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20  s and refuses.  
16390 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68     * to go furth
163a0 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73  er. Earlier vers
163b0 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ions of OpenSSL 
163c0 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72  carried on regar
163d0 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20  dless..     */. 
163e0 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e     srand((unsign
163f0 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69  ed int) time((ti
16400 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a  me_t *) NULL));.
16410 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69      do {..for (i
16420 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b   = 0; i < 16; i+
16430 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65  +) {..    rnd_se
16440 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61  ed[i] = 1 + (cha
16450 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64  r) (255.0 * rand
16460 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30  ()/(RAND_MAX+1.0
16470 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65  ));..}..RAND_see
16480 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65  d(rnd_seed, size
16490 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20  of(rnd_seed));. 
164a0 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44     } while (RAND
164b0 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b  _status() != 1);
164c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
164d0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
164e0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
164f0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
16500 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
16510 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
16520 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74 61  ..    return(sta
16530 74 75 73 29 3b 0a 7d 0a                          tus);.}.