Hex Artifact Content

Artifact c996e233eae03e3dcd18202db1db22d4cdec0c36a9b6c91c974856ec94e58b74:


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 76 6f 69 64 20 2a 29 20  eserve((void *) 
0b70: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
0b80: 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69 64 20  _Preserve((void 
0b90: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  *) statePtr);.. 
0ba0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0bb0: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0bc0: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0bd0: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0be0: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0bf0: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c00: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0c20: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0c30: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0c40: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0c50: 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e  OBAL);.    dprin
0c60: 74 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b  tf("EvalCallback
0c70: 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20  : %d", code);.  
0c80: 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43    if (code == TC
0c90: 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63  L_OK) {../* Chec
0ca0: 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74  k result for ret
0cb0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63  urn value */..Tc
0cc0: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20  l_Obj *result = 
0cd0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
0ce0: 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72  (interp);..if (r
0cf0: 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  esult == NULL ||
0d00: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
0d10: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  bj(interp, resul
0d20: 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f  t, &ok) != TCL_O
0d30: 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31  K) {..    ok = 1
0d40: 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52  ;..}..dprintf("R
0d50: 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b  esult: %d", ok);
0d60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
0d70: 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74  * Error - reject
0d80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
0d90: 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63   */..dprintf("Tc
0da0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
0db0: 72 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  r");.#if (TCL_MA
0dc0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
0dd0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
0de0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
0df0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
0e00: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
0e10: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e20: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
0e30: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
0e40: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52      }..    Tcl_R
0e50: 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29 20  elease((void *) 
0e60: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
0e70: 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64  cl_Release((void
0e80: 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20   *) interp);.   
0e90: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a   return ok;.}...
0ea0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0eb0: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 49  --------. *. * I
0ef0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0f00: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
0f10: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0f20: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0f30: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0f40: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0f60: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0f70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0f80: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
0fc0: 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c  ic void.InfoCall
0fd0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
0fe0: 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20  ssl, int where, 
0ff0: 69 6e 74 20 72 65 74 29 0a 7b 0a 20 20 20 20 53  int ret).{.    S
1000: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
1010: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74   (State*)SSL_get
1020: 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a  _app_data((SSL *
1030: 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49  )ssl);.    Tcl_I
1040: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
1050: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1060: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
1070: 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74  mdPtr;.    const
1080: 20 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d   char *major, *m
1090: 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  inor;..    dprin
10a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
10b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
10c0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
10d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65  l_Obj*)NULL)..re
10e0: 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77  turn;..    if (w
10f0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
1100: 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b  NDSHAKE_START) {
1110: 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73  ..major = "hands
1120: 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20  hake";..minor = 
1130: 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65  "start";.    } e
1140: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1150: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45  SSL_CB_HANDSHAKE
1160: 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20  _DONE) {..major 
1170: 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09  = "handshake";..
1180: 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a  minor = "done";.
1190: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
11a0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
11b0: 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d  _ALERT)..major =
11c0: 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20   "alert";..else 
11d0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11e0: 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f  ST_CONNECT).majo
11f0: 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09  r = "connect";..
1200: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
1210: 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09   SSL_ST_ACCEPT).
1220: 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74  .major = "accept
1230: 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a  ";..else.....maj
1240: 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  or = "unknown";.
1250: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1260: 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f  L_CB_READ)..mino
1270: 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73  r = "read";..els
1280: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1290: 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e  L_CB_WRITE)..min
12a0: 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65  or = "write";..e
12b0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
12c0: 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69  SSL_CB_LOOP)..mi
12d0: 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65  nor = "loop";..e
12e0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
12f0: 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69  SSL_CB_EXIT)..mi
1300: 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65  nor = "exit";..e
1310: 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20  lse.....minor = 
1320: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1330: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1340: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
1350: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d  with fn, chan, m
1360: 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73  ajor, minor, mes
1370: 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61  sage, and type a
1380: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
1390: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
13a0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
13b0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
13c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
13e0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
13f0: 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20  ringObj("info", 
1400: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1410: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1420: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1430: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1440: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
1450: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1460: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1470: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1480: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1490: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
14a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14b0: 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20  (major, -1));.  
14c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14e0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
14f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f  ewStringObj(mino
1500: 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66  r, -1));..    if
1510: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1520: 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c  _ALERT) {..Tcl_L
1530: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1540: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1550: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1560: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c  StringObj(SSL_al
1570: 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f  ert_desc_string_
1580: 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b  long(ret), -1));
1590: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
15a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
15b0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
15c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
15d0: 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f  (SSL_alert_type_
15e0: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
15f0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c  , -1));.    } el
1600: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  se {..Tcl_ListOb
1610: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1620: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1630: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1640: 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73  gObj(SSL_state_s
1650: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
1660: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
1670: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1680: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1690: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16a0: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a  j("info", -1));.
16b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76      }..    /* Ev
16c0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
16d0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
16e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
16f0: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
1700: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
1710: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
1720: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1730: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
1740: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
1750: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
1790: 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  * MessageCallbac
17a0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
17b0: 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c  ors SSL protocol
17c0: 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20   messages. *. * 
17d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
17e0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
17f0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
1800: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
1810: 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ed). *. *-------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f  ------------. */
1860: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
1870: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74  _NO_SSL_TRACE.st
1880: 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67  atic void.Messag
1890: 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72  eCallback(int wr
18a0: 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69  ite_p, int versi
18b0: 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f  on, int content_
18c0: 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64  type, const void
18d0: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65   *buf, size_t le
18e0: 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69  n, SSL *ssl, voi
18f0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
1900: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
1910: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
1920: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1930: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
1940: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
1950: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
1960: 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70   char *ver, *typ
1970: 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  e;.    BIO *bio;
1980: 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72  .    char buffer
1990: 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66  [15000];.    buf
19a0: 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20  fer[0] = 0;..   
19b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
19c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
19d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
19e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
19f0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
1a00: 20 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29   switch(version)
1a10: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
1a20: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
1a30: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
1a40: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
1a50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1a60: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
1a70: 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53    case SSL2_VERS
1a80: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1a90: 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v2";..break;.#en
1aa0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
1ab0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
1ac0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
1ad0: 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20  _SSL3).    case 
1ae0: 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  SSL3_VERSION:..v
1af0: 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62  er = "SSLv3";..b
1b00: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
1b10: 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49   case TLS1_VERSI
1b20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b30: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1b40: 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53  case TLS1_1_VERS
1b50: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1b60: 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.1";..break;. 
1b70: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56     case TLS1_2_V
1b80: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1b90: 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b  TLSv1.2";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f  ;.    case TLS1_
1bb0: 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  3_VERSION:..ver 
1bc0: 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72  = "TLSv1.3";..br
1bd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a  eak;.    case 0:
1be0: 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a  ..ver = "none";.
1bf0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
1c00: 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b  ult:..ver = "unk
1c10: 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  nown";..break;. 
1c20: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
1c30: 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20   (content_type) 
1c40: 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  {.    case SSL3_
1c50: 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65  RT_HEADER:..type
1c60: 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72   = "Header";..br
1c70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1c80: 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54  L3_RT_INNER_CONT
1c90: 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20  ENT_TYPE:..type 
1ca0: 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74  = "Inner Content
1cb0: 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a   Type";..break;.
1cc0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1cd0: 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53  _CHANGE_CIPHER_S
1ce0: 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68  PEC:..type = "Ch
1cf0: 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62  ange Cipher";..b
1d00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d10: 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74  SL3_RT_ALERT:..t
1d20: 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09  ype = "Alert";..
1d30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d40: 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b  SSL3_RT_HANDSHAK
1d50: 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64  E:..type = "Hand
1d60: 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a  shake";..break;.
1d70: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1d80: 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54  _APPLICATION_DAT
1d90: 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20  A:..type = "App 
1da0: 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  Data";..break;.#
1db0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
1dc0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
1dd0: 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61 73 65  000000L.    case
1de0: 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42   DTLS1_RT_HEARTB
1df0: 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65  EAT:..type = "He
1e00: 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b  artbeat";..break
1e10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  ;.#endif.    def
1e20: 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75  ault:..type = "u
1e30: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a  nknown";.    }..
1e40: 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d      /* Needs com
1e50: 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e  pile time option
1e60: 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61   "enable-ssl-tra
1e70: 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ce". */.    if (
1e80: 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42  (bio = BIO_new(B
1e90: 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20  IO_s_mem())) != 
1ea0: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a  NULL) {..int n;.
1eb0: 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65  .SSL_trace(write
1ec0: 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e  _p, version, con
1ed0: 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20  tent_type, buf, 
1ee0: 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20  len, ssl, (void 
1ef0: 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f  *)bio);..n = BIO
1f00: 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65  _read(bio, buffe
1f10: 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62  r, BIO_pending(b
1f20: 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 42 49  io) < 15000 ? BI
1f30: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a  O_pending(bio) :
1f40: 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e   14999);..n = (n
1f50: 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75  <0) ? 0 : n;..bu
1f60: 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76  ffer[n] = 0;..(v
1f70: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69  oid)BIO_flush(bi
1f80: 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69  o);..BIO_free(bi
1f90: 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  o);.   }..    /*
1fa0: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
1fb0: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
1fc0: 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e   chan, direction
1fd0: 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c  , version, type,
1fe0: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67   and message arg
1ff0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
2000: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2010: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
2020: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
2030: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2040: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2050: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2060: 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c  ngObj("message",
2070: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2080: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2090: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
20a0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
20b0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
20c0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
20d0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
20e0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
20f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2100: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2110: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2120: 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e  j(write_p ? "Sen
2130: 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c  t" : "Received",
2140: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2150: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2160: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2170: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2180: 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a  gObj(ver, -1));.
2190: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
21a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
21c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79  _NewStringObj(ty
21d0: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  pe, -1));.    Tc
21e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
21f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2200: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2210: 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20  ringObj(buffer, 
2220: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
2230: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
2240: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
2250: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2260: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
2270: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2280: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2290: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
22a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
22b0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43  --. *. * VerifyC
2310: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
2320: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65  .Monitors SSL ce
2330: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
2340: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73  tion process. Us
2350: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
2360: 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68  e. *.behavior wh
2370: 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46  en the SSL_VERIF
2380: 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73  Y_PEER flag is s
2390: 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  et. This is call
23a0: 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61  ed. *.whenever a
23b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
23c0: 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63  inspected or dec
23d0: 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61  ided invalid. Ca
23e0: 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68  lled for. *.each
23f0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20   certificate in 
2400: 74 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a  the cert chain..
2410: 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a   *. * Checks:. *
2420: 09 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61  .certificate cha
2430: 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74  in is checked st
2440: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
2450: 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20  deepest nesting 
2460: 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20  level. *.  (the 
2470: 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63  root CA certific
2480: 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20  ate) and worked 
2490: 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65  upward to the pe
24a0: 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65  er's certificate
24b0: 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75  .. *.All signatu
24c0: 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63  res are valid, c
24d0: 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77  urrent time is w
24e0: 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20  ithin first and 
24f0: 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69  last validity ti
2500: 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61  me.. *.Check tha
2510: 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  t the certificat
2520: 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74  e is issued by t
2530: 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66  he issuer certif
2540: 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a  icate issuer.. *
2550: 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63  .Check the revoc
2560: 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72  ation status for
2570: 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74   each certificat
2580: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20  e.. *.Check the 
2590: 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20  validity of the 
25a0: 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68  given CRL and th
25b0: 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f  e cert revocatio
25c0: 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65  n status.. *.Che
25d0: 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20  ck the policies 
25e0: 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69  of all the certi
25f0: 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72  ficates. *. * Ar
2600: 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f  gs. *.preverify_
2610: 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65  ok indicates whe
2620: 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69  ther the certifi
2630: 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f  cate verificatio
2640: 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20  n passed (1) or 
2650: 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65  not (0). *. * Re
2660: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c  sults:. *.A call
2670: 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68  back bound to th
2680: 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74  e socket may ret
2690: 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20  urn one of:. *. 
26a0: 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72     0...- the cer
26b0: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
26c0: 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64  ed invalid, send
26d0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a   verification. *
26e0: 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c  ....  failure al
26f0: 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64  ert to peer, and
2700: 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73   terminate hands
2710: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09  hake.. *.    1..
2720: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61  .- the certifica
2730: 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c  te is deemed val
2740: 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  id, continue wit
2750: 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  h handshake.. *.
2760: 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67      empty string
2770: 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20  .- no change to 
2780: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
2790: 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64  dation. *. * Sid
27a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
27b0: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74  e err field of t
27c0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
27d0: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20  rative State is 
27e0: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74  set. *.  to a st
27f0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
2800: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  the SSL negotiat
2810: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73  ion failure reas
2820: 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  on. *. *--------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a  -----------. */.
2870: 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66  static int.Verif
2880: 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b  yCallback(int ok
2890: 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  , X509_STORE_CTX
28a0: 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c   *ctx) {.    Tcl
28b0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
28c0: 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20    SSL   *ssl..= 
28d0: 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45  (SSL*)X509_STORE
28e0: 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61  _CTX_get_ex_data
28f0: 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78  (ctx, SSL_get_ex
2900: 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45  _data_X509_STORE
2910: 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20  _CTX_idx());.   
2920: 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20   X509  *cert..= 
2930: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
2940: 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28  et_current_cert(
2950: 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20  ctx);.    State 
2960: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
2970: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
2980: 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54  data(ssl);.    T
2990: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29a0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
29b0: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65  terp;.    int de
29c0: 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  pth..= X509_STOR
29d0: 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f  E_CTX_get_error_
29e0: 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20  depth(ctx);.    
29f0: 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f  int err..= X509_
2a00: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72  STORE_CTX_get_er
2a10: 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64  ror(ctx);..    d
2a20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
2a30: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ;.    dprintf("V
2a40: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25  erifyCallback: %
2a50: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
2a60: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
2a70: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
2a80: 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b  LL) {../* Use ok
2a90: 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 69   value if verifi
2aa0: 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  cation is requir
2ab0: 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65  ed */..if (state
2ac0: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2ad0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2ae0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2af0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2b00: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2b10: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2b20: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74   } else if (cert
2b30: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20   == NULL || ssl 
2b40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
2b50: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
2b60: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2b70: 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63  Callback: eval c
2b80: 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20  allback");..    
2b90: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
2ba0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
2bb0: 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20  n, chan, depth, 
2bc0: 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20  cert info list, 
2bd0: 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f  status, and erro
2be0: 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  r args */.    cm
2bf0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
2c00: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
2c10: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c  ->vcmd);.    Tcl
2c20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2c40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2c50: 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c  ingObj("verify",
2c60: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2c70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2c90: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2ca0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
2cb0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
2cc0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
2cd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2ce0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2cf0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2d00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68  _NewIntObj(depth
2d10: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2d20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2d30: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2d40: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28   Tls_NewX509Obj(
2d50: 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a  interp, cert));.
2d60: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2d70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2d80: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2d90: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b  _NewIntObj(ok));
2da0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2db0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2dc0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
2dd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2de0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69  (char*)X509_veri
2df0: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
2e00: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
2e10: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74  ..    /* Prevent
2e20: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62   I/O while callb
2e30: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ack is in progre
2e40: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61  ss */.    /* sta
2e50: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
2e60: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
2e70: 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61  ; */..    /* Eva
2e80: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2e90: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2ea0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2eb0: 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61  r);.    ok = Eva
2ec0: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
2ed0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
2ee0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
2ef0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2f00: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
2f10: 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a  "VerifyCallback:
2f20: 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20   command result 
2f30: 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  = %d", ok);..   
2f40: 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c   /* statePtr->fl
2f50: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c  ags &= ~(TLS_TCL
2f60: 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20  _CALLBACK); */. 
2f70: 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f     return(ok);./
2f80: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65  * By default, le
2f90: 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ave verification
2fa0: 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d   unchanged. */.}
2fb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3000: 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20  * Tls_Error --. 
3010: 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  *. *.Calls callb
3020: 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66  ack with list of
3030: 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53   errors.. *. * S
3040: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3050: 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66  The err field of
3060: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   the currently o
3070: 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69  perative State i
3080: 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20  s set. *.  to a 
3090: 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e  string describin
30a0: 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69  g the SSL negoti
30b0: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65  ation failure re
30c0: 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ason. *. *------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
3110: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72  /.void.Tls_Error
3120: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
3130: 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20  , char *msg) {. 
3140: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3150: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
3160: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
3170: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a  l_Obj *cmdPtr, *
3180: 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73  listPtr;.    uns
3190: 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a  igned long err;.
31a0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
31b0: 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70  r = msg;..    dp
31c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
31d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
31e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
31f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
3200: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  .return;..    /*
3210: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
3220: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
3230: 20 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61   chan, and messa
3240: 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  ge args */.    c
3250: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
3260: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
3270: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
3280: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3290: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
32a0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
32b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72  ewStringObj("err
32c0: 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  or", -1));.    T
32d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
32e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
32f0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
3300: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
3310: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
3320: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
3330: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28  , -1));.    if (
3340: 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  msg != NULL) {..
3350: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3360: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3370: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3380: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3390: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
33a0: 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f   if ((msg = Tcl_
33b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
33c0: 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c  (Tcl_GetObjResul
33d0: 74 28 69 6e 74 65 72 70 29 2c 20 28 54 63 6c 5f  t(interp), (Tcl_
33e0: 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 29 20 21  Size *) NULL)) !
33f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c  = NULL) {..Tcl_L
3400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3430: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a  gObj(msg, -1));.
3440: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c  .    } else {..l
3450: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
3460: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
3470: 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d  ;..while ((err =
3480: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29   ERR_get_error()
3490: 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) != 0) {..    T
34a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
34b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
34c0: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
34d0: 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65  StringObj(ERR_re
34e0: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ason_error_strin
34f0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d  g(err), -1));..}
3500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
3510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3520: 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50  p, cmdPtr, listP
3530: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
3540: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3550: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3560: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3570: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
3580: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
3590: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
35a0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
35b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
35c0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c  . *. * KeyLogCal
3620: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57  lback --. *. *.W
3630: 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65  rite received ke
3640: 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69  y data to log fi
3650: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  le.. *. * Side e
3660: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
3670: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
36c0: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  d KeyLogCallback
36d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
36e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e   const char *lin
36f0: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  e) {.    char *s
3700: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b  tr = getenv(SSLK
3710: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20  EYLOGFILE);.    
3720: 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64  FILE *fd;..    d
3730: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
3740: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20  ;..    if (str) 
3750: 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74  {..fd = fopen(st
3760: 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74  r, "a");..fprint
3770: 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e  f(fd, "%s\n",lin
3780: 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b  e);..fclose(fd);
3790: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f  ---. *. * Passwo
37f0: 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  rd Callback --. 
3800: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
3810: 20 61 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20   a password for 
3820: 61 20 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f  a private key lo
3830: 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20  ading/storing a 
3840: 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61  PEM. *.certifica
3850: 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 69  te with encrypti
3860: 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61  on. Evals callba
3870: 63 6b 20 73 63 72 69 70 74 20 61 6e 64 20 72 65  ck script and re
3880: 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73  turns. *.the res
3890: 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 77  ult as the passw
38a0: 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75  ord string in bu
38b0: 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  f.. *. * Results
38c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
38d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
38e0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
38f0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
3900: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50   * Returns:. *.P
3910: 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20  assword size in 
3920: 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20  bytes or -1 for 
3930: 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d  an error.. *. *-
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
3990: 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  t.PasswordCallba
39a0: 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e  ck(char *buf, in
39b0: 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c  t size, int rwfl
39c0: 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29  ag, void *udata)
39d0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
39e0: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20  atePtr.= (State 
39f0: 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63  *) udata;.    Tc
3a00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3a10: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
3a20: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
3a30: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
3a40: 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72  t code;..    dpr
3a50: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
3a60: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61  .    /* If no ca
3a70: 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61  llback, use defa
3a80: 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ult callback */.
3a90: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3aa0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55  ->password == NU
3ab0: 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45  LL) {..if (Tcl_E
3ac0: 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74  valEx(interp, "t
3ad0: 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d  ls::password", -
3ae0: 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
3af0: 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  AL) == TCL_OK) {
3b00: 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20  ..    char *ret 
3b10: 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  = (char *) Tcl_G
3b20: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
3b30: 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72  nterp);..    str
3b40: 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28  ncpy(buf, ret, (
3b50: 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09  size_t) size);..
3b60: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
3b70: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20  strlen(ret);..} 
3b80: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75  else {..    retu
3b90: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a  rn -1;..}.    }.
3ba0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
3bb0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
3bc0: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20  ith fn, rwflag, 
3bd0: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f  and size args */
3be0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3bf0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3c00: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
3c10: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
3c20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3c30: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3c40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3c50: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  j("password", -1
3c60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3c70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3c80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3c90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
3ca0: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c  wflag));.    Tcl
3cb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3cc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3cd0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3ce0: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20  Obj(size));..   
3cf0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76   Tcl_Preserve((v
3d00: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a  oid *) interp);.
3d10: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3d20: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50  ((void *) stateP
3d30: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  tr);..    /* Eva
3d40: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3d50: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3d60: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3d70: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54  r);.    code = T
3d80: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
3d90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
3da0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
3db0: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54     if (code != T
3dc0: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43  CL_OK) {.#if (TC
3dd0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
3de0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
3df0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
3e00: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3e10: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
3e20: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
3e30: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
3e40: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
3e50: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  dif.    }.    Tc
3e60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
3e70: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
3e80: 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a  _Release((void *
3e90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
3ea0: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66    /* If successf
3eb0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61  ul, pass back pa
3ec0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e  ssword string an
3ed0: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f  d truncate if to
3ee0: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66  o long */.    if
3ef0: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b   (code == TCL_OK
3f00: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65  ) {..Tcl_Size le
3f10: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20  n;..char *ret = 
3f20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3f30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3f40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3f50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3f60: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53  if (len > (Tcl_S
3f70: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09  ize) size-1) {..
3f80: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53      len = (Tcl_S
3f90: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a  ize) size-1;..}.
3fa0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
3fb0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  t, (size_t) len)
3fc0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c  ;..buf[len] = '\
3fd0: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  0';..Tcl_Release
3fe0: 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70  ((void *) interp
3ff0: 29 3b 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29  );..return((int)
4000: 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20   len);.    }.   
4010: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f   Tcl_Release((vo
4020: 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20  id *) interp);. 
4030: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a     return -1;.}.
4040: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4090: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63   Session Callbac
40a0: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d  k for Clients --
40b0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68  . *. *.Called wh
40c0: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
40d0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
40e0: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31   cache. In TLS 1
40f0: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62  .3. *.this may b
4100: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
4110: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20  ple times after 
4120: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46  the handshake. F
4130: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65  or. *.earlier ve
4140: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c  rsions, this wil
4150: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75  l be received du
4160: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61  ring the handsha
4170: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74  ke.. *.This is t
4180: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79  he preferred way
4190: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73   to obtain a res
41a0: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a  umable session..
41b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
41c0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
41d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
41e0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
41f0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4200: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4210: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65  .0 = error where
4220: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65   session will be
4230: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d   immediately rem
4240: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  oved from the in
4250: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a  ternal cache.. *
4260: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65  .1 = success whe
4270: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73  re app retains s
4280: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f  ession in sessio
4290: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73  n cache, and mus
42a0: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49  t call SSL_SESSI
42b0: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64  ON_free() when d
42c0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4310: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73  /.static int.Ses
4320: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c  sionCallback(SSL
4330: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
4340: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
4350: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4360: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
4370: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
4380: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
4390: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
43a0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
43b0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
43c0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
43d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
43e0: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
43f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4400: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
4410: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
4420: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
4430: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
4440: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
4450: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
4460: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
4470: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4480: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4490: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
44a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
44b0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
44c0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
44d0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
44e0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
44f0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
4500: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73  th fn, chan, ses
4510: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e  sion id, session
4520: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66   ticket, and lif
4530: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20  etime args */.  
4540: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
4550: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
4560: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
4570: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4580: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4590: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
45a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
45b0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
45c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
45d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
45e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
45f0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
4600: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
4610: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
4620: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  self), -1));..  
4630: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20    /* Session id 
4640: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69  */.    session_i
4650: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
4660: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
4670: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  &ulen);.    Tcl_
4680: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4690: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
46a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
46b0: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e  ArrayObj(session
46c0: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
46d0: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
46e0: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
46f0: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
4700: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
4710: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
4720: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
4730: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4740: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4750: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
4760: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
4770: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
4780: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65  ));..    /* Life
4790: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66  time - number of
47a0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20   seconds */.    
47b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
47c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
47d0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
47e0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20  wLongObj((long) 
47f0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
4800: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
4810: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
4820: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
4830: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
4840: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
4850: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4860: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
4870: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4880: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
4890: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
48a0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
48b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 0;.}.../*. 
48c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20  ----. *. * ALPN 
4910: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72  Callback for Ser
4920: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c  vers and NPN Cal
4930: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74  lback for Client
4940: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
4950: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74  rm protocol (htt
4960: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65  p/1.1, h2, h3, e
4970: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66  tc.) selection f
4980: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69  or the. *.incomi
4990: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43  ng connection. C
49a0: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c  alled after Hell
49b0: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c  o and server cal
49c0: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65  lbacks.. *.Where
49d0: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74   'out' is select
49e0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20  ed protocol and 
49f0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72  'in' is the peer
4a00: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74   advertised list
4a10: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4a20: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4a30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4a40: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4a50: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
4a60: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
4a70: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4a80: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  R_OK: ALPN proto
4a90: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
4aa0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4ab0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
4ac0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
4ad0: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73  FATAL: There was
4ae0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77   no overlap betw
4af0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73  een the client's
4b00: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64  . *.    supplied
4b10: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65   list and the se
4b20: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  rver configurati
4b30: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
4b40: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74  on will be abort
4b50: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ed.. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50  T_ERR_NOACK: ALP
4b70: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  N protocol not s
4b80: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62  elected, e.g., b
4b90: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20  ecause no ALPN. 
4ba0: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20  *.    protocols 
4bb0: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66  are configured f
4bc0: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  or this connecti
4bd0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
4be0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
4bf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4c40: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61  c int.ALPNCallba
4c50: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  ck(SSL *ssl, con
4c60: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4c70: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64   **out, unsigned
4c80: 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09   char *outlen,..
4c90: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4ca0: 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65  har *in, unsigne
4cb0: 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69  d int inlen, voi
4cc0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
4cd0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4ce0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
4cf0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4d00: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
4d10: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
4d20: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
4d30: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
4d40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4d50: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4d60: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
4d70: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
4d80: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4d90: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
4da0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63   }..    /* Selec
4db0: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20  t protocol */.  
4dc0: 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74    if (SSL_select
4dd0: 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73  _next_proto((uns
4de0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f  igned char **) o
4df0: 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74  ut, outlen, stat
4e00: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74  ePtr->protos, st
4e10: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
4e20: 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20  en,..in, inlen) 
4e30: 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e  == OPENSSL_NPN_N
4e40: 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a  EGOTIATED) {../*
4e50: 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   Match found */.
4e60: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
4e70: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
4e80: 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53  else {../* OPENS
4e90: 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41  SL_NPN_NO_OVERLA
4ea0: 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20  P = No overlap, 
4eb0: 73 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65  so use first ite
4ec0: 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72  m from client pr
4ed0: 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09  otocol list */..
4ee0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
4ef0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4f00: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
4f10: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
4f20: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
4f30: 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20  return res;.    
4f40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
4f50: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
4f60: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
4f70: 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f  depth, cert info
4f80: 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61   list, status, a
4f90: 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f  nd error args */
4fa0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4fb0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4fc0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
4fd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4fe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4ff0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5000: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61  _NewStringObj("a
5010: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lpn", -1));.    
5020: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5030: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5040: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
5050: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
5060: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
5070: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
5080: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
5090: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
50a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
50b0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
50c0: 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68  ingObj((const ch
50d0: 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29  ar *) *out, -1))
50e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
50f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5100: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
5110: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
5120: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45  (res == SSL_TLSE
5130: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20  XT_ERR_OK));..  
5140: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
5150: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
5160: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5170: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
5180: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
5190: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
51a0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
51b0: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
51c0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
51d0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c  _NOACK;.    } el
51e0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
51f0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5200: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
5210: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
5220: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5230: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20  _ALERT_FATAL;.  
5240: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5250: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5260: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5270: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
52c0: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50  *. * Advertise P
52d0: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63  rotocols Callbac
52e0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f  k for Next Proto
52f0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20  col Negotiation 
5300: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48  (NPN) in ServerH
5310: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61  ello --. *. *.ca
5320: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20  lled when a TLS 
5330: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c  server needs a l
5340: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64  ist of supported
5350: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e   protocols for N
5360: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20  ext. *.Protocol 
5370: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a  Negotiation.. *.
5380: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5390: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
53a0: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65  ffects:. *. * Re
53b0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
53c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
53d0: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73  : NPN protocol s
53e0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
53f0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
5400: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
5410: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20  _ERR_NOACK: NPN 
5420: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
5430: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
5440: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5450: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
54a0: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61  fdef USE_NPN.sta
54b0: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62  tic int.NPNCallb
54c0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
54d0: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
54e0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
54f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74  nsigned int *out
5500: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
5510: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
5520: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
5530: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  arg;..    dprint
5540: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5550: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
5560: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
5570: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5580: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5590: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
55a0: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  Set protocols li
55b0: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  st */.    if (st
55c0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
55d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20  = NULL) {..*out 
55e0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
55f0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73  os;..*outlen = s
5600: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
5610: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
5620: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a  {..*out = NULL;.
5630: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72  .*outlen = 0;..r
5640: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5650: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5660: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c  }.    return SSL
5670: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5680: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a  }.#endif.../*. *
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61  ---. *. * SNI Ca
56e0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
56f0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  rs --. *. *.Perf
5700: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20  orm server-side 
5710: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c  SNI hostname sel
5720: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63  ection after rec
5730: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e  eiving SNI exten
5740: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e  sion. *.in Clien
5750: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20  t Hello. Called 
5760: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c  after hello call
5770: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20  back but before 
5780: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  ALPN callback.. 
5790: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
57a0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
57b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
57c0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
57d0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
57e0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
57f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5800: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  K: SNI hostname 
5810: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  is accepted. The
5820: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
5830: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5840: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5850: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61  ATAL: SNI hostna
5860: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5870: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5880: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f  on. *.    is abo
5890: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f  rted. Default fo
58a0: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41  r alert is SSL_A
58b0: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
58c0: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  AME.. *.SSL_TLSE
58d0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
58e0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61  NING: SNI hostna
58f0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5900: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72  ed, warning aler
5910: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e  t. *.    sent (n
5920: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
5930: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f  TLSv1.3). The co
5940: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5950: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5960: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49  T_ERR_NOACK: SNI
5970: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5980: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f   accepted and no
5990: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a  t acknowledged,.
59a0: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53   *.    e.g. if S
59b0: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  NI has not been 
59c0: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20  configured. The 
59d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
59e0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5a30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e  */.static int.SN
5a40: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  ICallback(const 
5a50: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
5a60: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
5a70: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5a80: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
5a90: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
5aa0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
5ab0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
5ac0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
5ad0: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
5ae0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e  de, res;.    con
5af0: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e  st char *servern
5b00: 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  ame = NULL;..   
5b10: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
5b20: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
5b30: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
5b40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
5b50: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5b60: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
5b70: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b      /* Only work
5b80: 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e  s for TLS 1.2 an
5b90: 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20  d earlier */.   
5ba0: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53   servername = SS
5bb0: 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65  L_get_servername
5bc0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d  (ssl, TLSEXT_NAM
5bd0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
5be0: 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65  ;.    if (!serve
5bf0: 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e  rname || servern
5c00: 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20  ame[0] == '\0') 
5c10: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5c20: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5c30: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
5c40: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
5c50: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
5c60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5c70: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
5c80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
5c90: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
5ca0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
5cb0: 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d  , and server nam
5cc0: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
5cd0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
5ce0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
5cf0: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c  ->vcmd);.    Tcl
5d00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5d10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5d20: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
5d30: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31  ingObj("sni", -1
5d40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5d50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5d60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5d70: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
5d80: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
5d90: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
5da0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
5db0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5dc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5dd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
5de0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
5df0: 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29  ervername , -1))
5e00: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
5e10: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
5e20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
5e30: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5e40: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
5e50: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
5e60: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
5e70: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
5e80: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5e90: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e  T_ERR_ALERT_WARN
5ea0: 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  ING;..*alert = S
5eb0: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
5ec0: 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20  ED_NAME; /* Not 
5ed0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53  supported by TLS
5ee0: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c   1.3 */.    } el
5ef0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
5f00: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5f10: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
5f20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
5f30: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5f40: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a  _ALERT_FATAL;..*
5f50: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55  alert = SSL_AD_U
5f60: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
5f70: 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74  ; /* Not support
5f80: 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f  ed by TLS 1.3 */
5f90: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
5fa0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
5fb0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
5fc0: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  res;.}.../*. *--
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6010: 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65  -. *. * ClientHe
6020: 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61  llo Handshake Ca
6030: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
6040: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64  rs --. *. *.Used
6050: 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78   by server to ex
6060: 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72  amine the server
6070: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e   name indication
6080: 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e   (SNI) extension
6090: 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20  . *.provided by 
60a0: 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72  the client in or
60b0: 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e  der to select an
60c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72   appropriate cer
60d0: 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70  tificate to. *.p
60e0: 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65  resent, and make
60f0: 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61   other configura
6100: 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73  tion adjustments
6110: 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61   relevant to tha
6120: 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65  t server. *.name
6130: 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75   and its configu
6140: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63  ration. This inc
6150: 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f  ludes swapping o
6160: 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
6170: 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69  d. *.SSL_CTX poi
6180: 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20  nter, modifying 
6190: 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73  the server's lis
61a0: 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54  t of permitted T
61b0: 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09  LS versions,. *.
61c0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72  changing the ser
61d0: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73  ver's cipher lis
61e0: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  t in response to
61f0: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69   the client's ci
6200: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a  pher list, etc..
6210: 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65   *.Called before
6220: 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61   SNI and ALPN ca
6230: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52  llbacks.. *. * R
6240: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
6250: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
6260: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
6270: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
6280: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
6290: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c  codes:. *.SSL_CL
62a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59  IENT_HELLO_RETRY
62b0: 3a 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61  : suspend the ha
62c0: 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65  ndshake, and the
62d0: 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74   handshake funct
62e0: 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ion will return 
62f0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53  immediately. *.S
6300: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6310: 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20  ERROR: failure, 
6320: 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63  terminate connec
6330: 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20  tion. Set alert 
6340: 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  to error code.. 
6350: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
6360: 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63  LO_SUCCESS: succ
6370: 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ess. *. *-------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
63c0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c  .static int.Hell
63d0: 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73  oCallback(SSL *s
63e0: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20  sl, int *alert, 
63f0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
6400: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
6410: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
6420: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
6430: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
6440: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
6450: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
6460: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65      int code, re
6470: 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  s;.    const cha
6480: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20  r *servername;. 
6490: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
64a0: 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73  d char *p;.    s
64b0: 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69  ize_t len, remai
64c0: 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ning;..    dprin
64d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
64e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
64f0: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
6500: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
6510: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6520: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20  LLO_SUCCESS;.   
6530: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
6540: 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29  == (const SSL *)
6550: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28  NULL || arg == (
6560: 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09  void *)NULL) {..
6570: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6580: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
65a0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66   names */.    if
65b0: 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65   (!SSL_client_he
65c0: 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c  llo_get0_ext(ssl
65d0: 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65  , TLSEXT_TYPE_se
65e0: 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26  rver_name, &p, &
65f0: 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65  remaining) || re
6600: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
6610: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6620: 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45  SSLV3_ALERT_ILLE
6630: 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09  GAL_PARAMETER;..
6640: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6650: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6660: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
6670: 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20  ract the length 
6680: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
6690: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a  list of names. *
66a0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  /.    len = (*(p
66b0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
66c0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
66d0: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d    if (len + 2 !=
66e0: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a   remaining) {..*
66f0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
6700: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
6710: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
6720: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6730: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6740: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
6750: 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20   = len;..    /* 
6760: 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63  The list in prac
6770: 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20  tice only has a 
6780: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20  single element, 
6790: 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  so we only consi
67a0: 64 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e  der the first on
67b0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
67c0: 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20  maining == 0 || 
67d0: 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e  *p++ != TLSEXT_N
67e0: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
67f0: 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  e) {..*alert = S
6800: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6810: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6820: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6830: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6840: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6850: 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20  ning--;..    /* 
6860: 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c  Now we can final
6870: 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20  ly pull out the 
6880: 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20  byte array with 
6890: 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e  the actual hostn
68a0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ame. */.    if (
68b0: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20  remaining <= 2) 
68c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
68d0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
68e0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
68f0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6900: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6910: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a    }.    len = (*
6920: 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20  (p++) << 8);.   
6930: 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a   len += *(p++);.
6940: 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20      if (len + 2 
6950: 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09  > remaining) {..
6960: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6970: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
6980: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
6990: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
69a0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
69b0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
69c0: 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72   len;.    server
69d0: 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
69e0: 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20  ar *)p;..    /* 
69f0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
6a00: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
6a10: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72  chan, and server
6a20: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20   name args */.  
6a30: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
6a40: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
6a50: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
6a60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6a70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6a80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
6a90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c  wStringObj("hell
6aa0: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
6ab0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6ac0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6ad0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
6ae0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
6af0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
6b00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
6b10: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6b20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6b30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
6b40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
6b50: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c  gObj(servername,
6b60: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29   (Tcl_Size) len)
6b70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
6b80: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
6b90: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
6ba0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6bb0: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20  ;.    if ((code 
6bc0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
6bd0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
6be0: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b   cmdPtr)) > 1) {
6bf0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
6c00: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a  NT_HELLO_RETRY;.
6c10: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6c20: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52  TLSV1_ALERT_USER
6c30: 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20  _CANCELLED;.    
6c40: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
6c50: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
6c60: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6c70: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
6c80: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
6c90: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6ca0: 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  ROR;..*alert = S
6cb0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6cc0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
6ce0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
6cf0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
6d00: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  res;.}.../******
6d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6d20: 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20  /* Commands     
6d30: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
6d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6d50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69  -------. *. * Ci
6da0: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c  phersObjCmd -- l
6db0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
6dc0: 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73  phers. *. *.This
6dd0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
6de0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
6df0: 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65   the "tls::ciphe
6e00: 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  rs" command. *.t
6e10: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
6e20: 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20   ciphers, based 
6e30: 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65  upon protocol se
6e40: 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65  lected.. *. * Re
6e50: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
6e60: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20  dard Tcl result 
6e70: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  list.. *. * Side
6e80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e   effects:. *.con
6e90: 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74  structs and dest
6ea0: 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74  roys SSL context
6eb0: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d   (CTX). *. *----
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6f00: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
6f10: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73   char *protocols
6f20: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20  [] = {.."ssl2", 
6f30: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20  "ssl3", "tls1", 
6f40: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e  "tls1.1", "tls1.
6f50: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55  2", "tls1.3", NU
6f60: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f  LL.};.enum proto
6f70: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53  col {.    TLS_SS
6f80: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c  L2, TLS_SSL3, TL
6f90: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31  S_TLS1, TLS_TLS1
6fa0: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20  _1, TLS_TLS1_2, 
6fb0: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f  TLS_TLS1_3, TLS_
6fc0: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  NONE.};..static 
6fd0: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d  int.CiphersObjCm
6fe0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
6ff0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
7000: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7010: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
7020: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f  .    Tcl_Obj.*co
7030: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
7040: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7050: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7060: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7070: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7080: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7090: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
70a0: 20 2a 73 6b 3b 0a 20 20 20 20 63 6f 6e 73 74 20   *sk;.    const 
70b0: 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 63 68  char *cp;.    ch
70c0: 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  ar buf[BUFSIZ];.
70d0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
70e0: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f  erbose = 0, use_
70f0: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20  supported = 0;. 
7100: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54     const SSL_MET
7110: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20  HOD *method;..  
7120: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
7130: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f  d");..    if ((o
7140: 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a  bjc < 2) || (obj
7150: 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57  c > 4)) {..Tcl_W
7160: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7170: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72  rp, 1, objv, "pr
7180: 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f  otocol ?verbose?
7190: 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a   ?supported?");.
71a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
71b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
71c0: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
71d0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
71e0: 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c  v[1], protocols,
71f0: 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20   "protocol", 0, 
7200: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f  &index) != TCL_O
7210: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7220: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7230: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29    if ((objc > 2)
7240: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
7250: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
7260: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62  , objv[2], &verb
7270: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ose) != TCL_OK) 
7280: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
7290: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
72a0: 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26  f ((objc > 3) &&
72b0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
72c0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
72d0: 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70  bjv[3], &use_sup
72e0: 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f  ported) != TCL_O
72f0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7300: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7310: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
7320: 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63  or();..    switc
7330: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  h ((enum protoco
7340: 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65  l)index) {..case
7350: 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f   TLS_SSL2:.#if O
7360: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
7370: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
7380: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
7390: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
73a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
73b0: 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  SL2)..    Tcl_Ap
73c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
73d0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
73e0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
73f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7400: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7410: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7420: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7430: 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28   = SSLv2_method(
7440: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
7450: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a  ..case TLS_SSL3:
7460: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7470: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
7480: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
7490: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
74a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
74b0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
74c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
74d0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
74e0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
74f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7500: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7510: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7520: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7530: 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28   = SSLv3_method(
7540: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
7550: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a  ..case TLS_TLS1:
7560: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7570: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
7580: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7590: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
75a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
75b0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
75c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
75d0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
75e0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
75f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7600: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7620: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7630: 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28   = TLSv1_method(
7640: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
7650: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
7660: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
7670: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
7680: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7690: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
76a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
76b0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_1_METHOD)..  
76c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
76d0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
76e0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
76f0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7700: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7710: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7720: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7730: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
7740: 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _1_method(); bre
7750: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7760: 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66   TLS_TLS1_2:.#if
7770: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7780: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
7790: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
77a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
77b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
77c0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
77d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
77e0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
77f0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7800: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7810: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7870: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
78b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
78c0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
78d0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
78e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
78f0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
7900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7910: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
7920: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65   method = TLS_me
7930: 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c  thod();..    SSL
7940: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
7950: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
7960: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
7970: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7980: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
7990: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
79a0: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62  VERSION);..    b
79b0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65  reak;.#endif..de
79c0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68  fault:..    meth
79d0: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28  od = TLS_method(
79e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
79f0: 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20     }..    ctx = 
7a00: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
7a10: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78  od);.    if (ctx
7a20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
7a30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7a40: 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45  terp, GET_ERR_RE
7a50: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
7a60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c  ;.    }..    ssl
7a80: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b   = SSL_new(ctx);
7a90: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
7aa0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7ab0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7ac0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7ad0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  (), NULL);..SSL_
7ae0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
7af0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7b00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7b10: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64  Use list and ord
7b20: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  er as would be s
7b30: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48  ent in a ClientH
7b40: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69  ello or all avai
7b50: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f  lable ciphers */
7b60: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70  .    if (use_sup
7b70: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20  ported) {..sk = 
7b80: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74  SSL_get1_support
7b90: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b  ed_ciphers(ssl);
7ba0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
7bb0: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68  k = SSL_get_ciph
7bc0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  ers(ssl);.    }.
7bd0: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e  .    if (sk != N
7be0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72  ULL) {..if (!ver
7bf0: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a  bose) {..    obj
7c00: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7c10: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7c20: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7c30: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7c40: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7c50: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7c60: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7c70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7c80: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7c90: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7ca0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7cb0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7cc0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7cd0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7ce0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7cf0: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7d00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7d10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7d20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7d30: 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29  ringObj(cp, -1))
7d40: 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73  ;..    }...} els
7d50: 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20  e {..    objPtr 
7d60: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
7d70: 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66  bj("",0);..    f
7d80: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
7d90: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
7da0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b  _num(sk); i++) {
7db0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50  ...const SSL_CIP
7dc0: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f  HER *c = sk_SSL_
7dd0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c  CIPHER_value(sk,
7de0: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20   i);...if (c == 
7df0: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NULL) continue;.
7e00: 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65  .../* textual de
7e10: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
7e20: 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20   cipher */...if 
7e30: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
7e40: 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20  ription(c, buf, 
7e50: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20  sizeof(buf)) != 
7e60: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
7e70: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7e80: 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f  jPtr, buf, (Tcl_
7e90: 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66  Size) strlen(buf
7ea0: 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ));...} else {..
7eb0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54  .    Tcl_AppendT
7ec0: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e  oObj(objPtr, "UN
7ed0: 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09  KNOWN\n", 8);...
7ee0: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20  }..    }..}..if 
7ef0: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20  (use_supported) 
7f00: 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49  {..    sk_SSL_CI
7f10: 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09  PHER_free(sk);..
7f20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  }.    }.    SSL_
7f30: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53  free(ssl);.    S
7f40: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
7f50: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
7f60: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
7f70: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
7f80: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
7f90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 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 0a 20 2a 0a 20 2a 20 50  --------. *. * P
7fe0: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d  rotocolsObjCmd -
7ff0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
8000: 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a   protocols. *. *
8010: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
8020: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
8030: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
8040: 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61  protocols" comma
8050: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76  nd. *.to list av
8060: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  ailable protocol
8070: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
8080: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
8090: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  Tcl result list.
80a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
80b0: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  cts:. *.none. *.
80c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
8110: 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62   int.ProtocolsOb
8120: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
8130: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
8140: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8150: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
8160: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  jc,.    Tcl_Obj 
8170: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8180: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
8190: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  jPtr;..    dprin
81a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
81b0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31     if (objc != 1
81c0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
81d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
81e0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74   objv, "");..ret
81f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8200: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
8210: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
8220: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
8230: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
8240: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  L);..#if OPENSSL
8250: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
8260: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
8270: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8280: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
8290: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
82a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
82b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
82c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
82d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
82e0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32  otocols[TLS_SSL2
82f0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8300: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8310: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
8320: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
8330: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
8340: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
8350: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
8360: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8370: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8380: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8390: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
83a0: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL3], -1));.
83b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
83c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
83d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
83e0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
83f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8400: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
8410: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8420: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8430: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
8440: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
8450: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c  ocols[TLS_TLS1],
8460: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8470: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8480: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
8490: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
84a0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
84b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
84c0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  _1_METHOD).    T
84d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
84e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
84f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8500: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
8510: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20  ls[TLS_TLS1_1], 
8520: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
8530: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
8540: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
8550: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8560: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
8570: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8580: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  2_METHOD).    Tc
8590: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
85a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
85b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
85c0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
85d0: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d  s[TLS_TLS1_2], -
85e0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
85f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8600: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
8610: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8620: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  3).    Tcl_ListO
8630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8640: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8650: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8660: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8670: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_3], -1));.#e
8680: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ndif..    Tcl_Se
8690: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
86a0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
86b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
86c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20  -----------. *. 
8710: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  * HandshakeObjCm
8720: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
8730: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
8740: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65  to verify whethe
8750: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  r the handshake 
8760: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f  is complete. *.o
8770: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  r not.. *. * Res
8780: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
8790: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
87a0: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b  1 means handshak
87b0: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65  e complete, 0 me
87c0: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a  ans pending.. *.
87d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
87e0: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53  . *.May force SS
87f0: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f  L negotiation to
8800: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a   take place.. *.
8810: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8850: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
8860: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62   int HandshakeOb
8870: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
8880: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
8890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
88a0: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
88b0: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  jc,.    Tcl_Obj 
88c0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b  *const objv[]).{
88d0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
88e0: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a   chan;        /*
88f0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
8900: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
8910: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
8920: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a  tePtr;        /*
8930: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
8940: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
8950: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8960: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  errStr = NULL;. 
8970: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a     int ret = 1;.
8980: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b      int err = 0;
8990: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
89a0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
89b0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
89c0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
89d0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
89e0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
89f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8a00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
8a10: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
8a20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
8a30: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8a40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
8a50: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
8a60: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55   (Tcl_Size *) NU
8a70: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
8a80: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8a90: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8aa0: 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  {..return(TCL_ER
8ab0: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
8ac0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
8ad0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
8ae0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
8af0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
8b00: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
8b10: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
8b20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
8b30: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
8b40: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
8b50: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8b60: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
8b70: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
8b80: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
8b90: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
8ba0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
8bb0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
8bc0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
8bd0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e  erp, "TLS", "HAN
8be0: 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45  DSHAKE", "CHANNE
8bf0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
8c00: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8c10: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
8c20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
8c30: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
8c40: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
8c50: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
8c60: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
8c70: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69  "Calling Tls_Wai
8c80: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20  tForConnect");. 
8c90: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69     ret = Tls_Wai
8ca0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
8cb0: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a  ePtr, &err, 1);.
8cc0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
8cd0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
8ce0: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72  returned: %i", r
8cf0: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  et);..    if (re
8d00: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65  t < 0 && ((state
8d10: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
8d20: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28  _TCL_ASYNC) && (
8d30: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29  err == EAGAIN)))
8d40: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79   {..dprintf("Asy
8d50: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d  nc set and err =
8d60: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20   EAGAIN");..ret 
8d70: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  = 0;.    } else 
8d80: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
8d90: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72  long result;..er
8da0: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
8db0: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
8dc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
8dd0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
8de0: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
8df0: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d  r || (*errStr ==
8e00: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53   0)) {..    errS
8e10: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72  tr = Tcl_PosixEr
8e20: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ror(interp);..}.
8e30: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8e40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
8e50: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
8e60: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a   errStr, (char *
8e70: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72  ) NULL);..if ((r
8e80: 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f  esult = SSL_get_
8e90: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
8ea0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d  atePtr->ssl)) !=
8eb0: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20   X509_V_OK) {.. 
8ec0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8ed0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75  ult(interp, " du
8ee0: 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76  e to \"", X509_v
8ef0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
8f00: 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c  _string(result),
8f10: 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20   "\"", (char *) 
8f20: 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53  NULL);..}..Tcl_S
8f30: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
8f40: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44  rp, "TLS", "HAND
8f50: 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22  SHAKE", "FAILED"
8f60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
8f70: 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75  ;..dprintf("Retu
8f80: 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20  rning TCL_ERROR 
8f90: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66  with handshake f
8fa0: 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53  ailed: %s", errS
8fb0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  tr);..return(TCL
8fc0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65  _ERROR);.    } e
8fd0: 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21  lse {..if (err !
8fe0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  = 0) {..    dpri
8ff0: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
9000: 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74  r with a complet
9010: 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72  ed handshake: er
9020: 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09  r = %i", err);..
9030: 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20  }..ret = 1;.    
9040: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
9050: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b  Returning TCL_OK
9060: 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c   with data \"%i\
9070: 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63  "", ret);.    Tc
9080: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
9090: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
90a0: 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20  tObj(ret));.    
90b0: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
90c0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
9110: 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  * ImportObjCmd -
9120: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
9130: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
9140: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
9150: 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20   "ssl" command. 
9160: 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d  *. *.The ssl com
9170: 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20  mand pushes SSL 
9180: 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f  over a (newly co
9190: 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63  nnected) tcp soc
91a0: 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ket. *. * Result
91b0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
91c0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
91d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
91e0: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74  . *.May modify t
91f0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61  he behavior of a
9200: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  n IO channel.. *
9210: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
9260: 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43  c int.ImportObjC
9270: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
9280: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
9290: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
92a0: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
92b0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
92c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20  onst objv[]).{. 
92d0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
92e0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
92f0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
9300: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74  de on. */.    St
9310: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09  ate *statePtr;..
9320: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
9330: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
9340: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  /.    SSL_CTX *c
9350: 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tx..= NULL;.    
9360: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
9370: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9380: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09  _Obj *password..
9390: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
93a0: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c  Obj *vcmd..= NUL
93b0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
93c0: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
93d0: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
93e0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
93f0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
9400: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
9410: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
9420: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63   int idx;.    Tc
9430: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20  l_Size len;.    
9440: 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c  int flags...= TL
9450: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20  S_TCL_INIT;.    
9460: 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30  int server...= 0
9470: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69  ;./* is connecti
9480: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f  on incoming or o
9490: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20  utgoing? */.    
94a0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d  char *keyfile..=
94b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
94c0: 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c  *certfile..= NUL
94d0: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
94e0: 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c  char *key..= NUL
94f0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
9500: 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20  key_len..= 0;.  
9510: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9520: 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *cert..= NULL;. 
9530: 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74     Tcl_Size cert
9540: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63  _len..= 0;.    c
9550: 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20  har *ciphers..= 
9560: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9570: 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20  ciphersuites..= 
9580: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9590: 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  CAfile..= NULL;.
95a0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68      char *CApath
95b0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
95c0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20  ar *DHparams..= 
95d0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
95e0: 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a  model...= NULL;.
95f0: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
9600: 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a  name..= NULL;./*
9610: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65   hostname for Se
9620: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61  rver Name Indica
9630: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tion */.    cons
9640: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9650: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55  *session_id = NU
9660: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
9670: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *alpn..= NULL;. 
9680: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c     int ssl2 = 0,
9690: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69   ssl3 = 0;.    i
96a0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73  nt tls1 = 1, tls
96b0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20  1_1 = 1, tls1_2 
96c0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b  = 1, tls1_3 = 1;
96d0: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d  .    int proto =
96e0: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a   0, level = -1;.
96f0: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d      int verify =
9700: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c   0, require = 0,
9710: 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f   request = 1, po
9720: 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30  st_handshake = 0
9730: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9740: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
9750: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9760: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9770: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
9780: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
9790: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
97a0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
97b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
97c0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
97d0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
97e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
97f0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9800: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9810: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
9820: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9830: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
9840: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9850: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9860: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
9870: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
9880: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
9890: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
98a0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
98b0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
98c0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
98d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
98e0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
98f0: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
9900: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9910: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9920: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
9930: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
9940: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
9950: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
9960: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
9980: 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f    * Make sure to
9990: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
99a0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
99b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e       */.    chan
99c0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
99d0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
99e0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69   for (idx = 2; i
99f0: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b  dx < objc; idx++
9a00: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d  ) {..char *opt =
9a10: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9a20: 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20  bjv[idx]);...if 
9a30: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a  (opt[0] != '-').
9a40: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50  .    break;...OP
9a50: 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c  TOBJ("-alpn", al
9a60: 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  pn);..OPTSTR("-c
9a70: 61 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a  adir", CApath);.
9a80: 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65  .OPTSTR("-cafile
9a90: 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54  ", CAfile);..OPT
9aa0: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65  BYTE("-cert", ce
9ab0: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09  rt, cert_len);..
9ac0: 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c  OPTSTR("-certfil
9ad0: 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09  e", certfile);..
9ae0: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22  OPTSTR("-cipher"
9af0: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54  , ciphers);..OPT
9b00: 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20  STR("-ciphers", 
9b10: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54  ciphers);..OPTST
9b20: 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73  R("-ciphersuites
9b30: 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29  ", ciphersuites)
9b40: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d  ;..OPTOBJ("-comm
9b50: 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09  and", script);..
9b60: 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d  OPTSTR("-dhparam
9b70: 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09  s", DHparams);..
9b80: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20  OPTBYTE("-key", 
9b90: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09  key, key_len);..
9ba0: 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65  OPTSTR("-keyfile
9bb0: 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50  ", keyfile);..OP
9bc0: 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d  TSTR("-model", m
9bd0: 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  odel);..OPTOBJ("
9be0: 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73  -password", pass
9bf0: 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  word);..OPTBOOL(
9c00: 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  "-post_handshake
9c10: 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ", post_handshak
9c20: 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  e);..OPTBOOL("-r
9c30: 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74  equest", request
9c40: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
9c50: 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29  quire", require)
9c60: 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75  ;..OPTINT("-secu
9c70: 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76  rity_level", lev
9c80: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  el);..OPTBOOL("-
9c90: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29  server", server)
9ca0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76  ;..OPTSTR("-serv
9cb0: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e  ername", servern
9cc0: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ame);..OPTSTR("-
9cd0: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
9ce0: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f  sion_id);..OPTBO
9cf0: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32  OL("-ssl2", ssl2
9d00: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
9d10: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54  l3", ssl3);..OPT
9d20: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c  BOOL("-tls1", tl
9d30: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  s1);..OPTBOOL("-
9d40: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29  tls1.1", tls1_1)
9d50: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9d60: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
9d70: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33  OPTBOOL("-tls1.3
9d80: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54  ", tls1_3);..OPT
9d90: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f  OBJ("-validateco
9da0: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09  mmand", vcmd);..
9db0: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20  OPTOBJ("-vcmd", 
9dc0: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28  vcmd);...OPTBAD(
9dd0: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e  "option", "-alpn
9de0: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c  , -cadir, -cafil
9df0: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66  e, -cert, -certf
9e00: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
9e10: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f  iphersuites, -co
9e20: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73  mmand, -dhparams
9e30: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65  , -key, -keyfile
9e40: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
9e50: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73  ord, -post_hands
9e60: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20  hake, -request, 
9e70: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72  -require, -secur
9e80: 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76  ity_level, -serv
9e90: 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c  er, -servername,
9ea0: 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73   -session_id, -s
9eb0: 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73  sl2, -ssl3, -tls
9ec0: 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73  1, -tls1.1, -tls
9ed0: 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72  1.2, -tls1.3, or
9ee0: 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e   -validatecomman
9ef0: 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43  d");...return TC
9f00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9f10: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09     if (request).
9f20: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
9f30: 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
9f40: 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  E | SSL_VERIFY_P
9f50: 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71  EER;.    if (req
9f60: 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29  uest && require)
9f70: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
9f80: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
9f90: 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20  _PEER_CERT;.    
9fa0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
9fb0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76  ost_handshake).v
9fc0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
9fd0: 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41  IFY_POST_HANDSHA
9fe0: 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69  KE;.    if (veri
9ff0: 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79  fy == 0)..verify
a000: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
a010: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
a020: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
a030: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
a040: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
a050: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
a060: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
a070: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
a080: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
a090: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a0a0: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
a0b0: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
a0c0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
a0d0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
a0e0: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
a0f0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
a100: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
a110: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
a120: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
a130: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
a140: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
a150: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
a160: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
a170: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
a180: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
a190: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
a1a0: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
a1b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a1c0: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
a1d0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
a1e0: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
a1f0: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
a200: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
a210: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
a220: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a230: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
a240: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
a250: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
a260: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
a270: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a  phersuites && !*
a280: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69  ciphersuites) ci
a290: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20  phersuites    = 
a2a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
a2b0: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
a2c0: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
a2d0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a2e0: 0a 20 20 20 20 69 66 20 28 43 41 70 61 74 68 20  .    if (CApath 
a2f0: 26 26 20 21 2a 43 41 70 61 74 68 29 09 20 20 20  && !*CApath).   
a300: 20 20 20 20 20 43 41 70 61 74 68 09 20 20 20 20       CApath.    
a310: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a320: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a330: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a340: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a350: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a360: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a370: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a380: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a390: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a3a0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a3b0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a3c0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a3d0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a3e0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a3f0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a400: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a410: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a420: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a430: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a440: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a450: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a460: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a470: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a480: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a490: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a4a0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a4b0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a4c0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a4d0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a4e0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a4f0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a500: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a510: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a520: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a530: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a540: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a550: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a560: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a570: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a580: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a590: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a5a0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a5b0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a5c0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a5d0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a5e0: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a5f0: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a600: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a610: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a620: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a630: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a640: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a650: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a660: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a670: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a680: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a690: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a6a0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a6b0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a6c0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a6d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a6e0: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a6f0: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a700: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a710: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a720: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
a730: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a740: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a750: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65  .}.../*.. * Make
a760: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
a770: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
a780: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68  channel.. */..ch
a790: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
a7a0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69  hannel(chan);..i
a7b0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
a7c0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
a7d0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
a7e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
a7f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a800: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
a810: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
a820: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
a830: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
a840: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
a850: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
a860: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
a870: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
a880: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
a890: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
a8a0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a8b0: 65 65 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74  ee((void *) stat
a8c0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a8d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a8e0: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
a8f0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
a900: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
a910: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
a920: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
a930: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
a940: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
a950: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
a960: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
a970: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e  t, (int) key_len
a980: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72  ,..    (int) cer
a990: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43  t_len, CApath, C
a9a0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
a9b0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
a9c0: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
a9d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
a9e0: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a  Tls_Free((void *
a9f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
aa00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aa10: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
aa20: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20    statePtr->ctx 
aa30: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20  = ctx;..    /*. 
aa40: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
aa50: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
aa60: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b  the channel work
aa70: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72  s in binary (for
aa80: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72   the.     * encr
aa90: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
aaa0: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20  t goofed up)..  
aab0: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e     * We only wan
aac0: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  t to adjust the 
aad0: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65  buffering in pre
aae0: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68  -v2 channels, wh
aaf0: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20  ere.     * each 
ab00: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73  channel in the s
ab10: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20  tack maintained 
ab20: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e  its own buffers.
ab30: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
ab40: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
ab50: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
ab60: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
ab70: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
ab80: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
ab90: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
aba0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
abb0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
abc0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
abd0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
abe0: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
abf0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
ac00: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ac10: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
ac20: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
ac30: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
ac40: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ac50: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
ac60: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
ac70: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
ac80: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ac90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aca0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
acb0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
acc0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
acd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ace0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
acf0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
ad00: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
ad10: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
ad20: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ad30: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad40: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ad50: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
ad60: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ad70: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ad80: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
ad90: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
ada0: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
adb0: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
adc0: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
add0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
ade0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
adf0: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
ae00: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
ae10: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
ae20: 2c 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c  , statePtr, (TCL
ae30: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f  _READABLE | TCL_
ae40: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29  WRITABLE), chan)
ae50: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
ae60: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e  reated channel n
ae70: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65  amed %s", Tcl_Ge
ae80: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
ae90: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
aea0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
aeb0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
aec0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
aed0: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66  /*.. * No use of
aee0: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46   Tcl_EventuallyF
aef0: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70  ree because no p
af00: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73  ossible Tcl_Pres
af10: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f  erve... */..Tls_
af20: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61  Free((void *)sta
af30: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
af40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
af50: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
af60: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
af70: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
af80: 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  f, "-translation
af90: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
afa0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
afb0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a  lTranslation));.
afc0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
afd0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
afe0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
aff0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63   "-encoding", Tc
b000: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
b010: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
b020: 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  ding));.    Tcl_
b030: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
b040: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
b050: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68  r->self, "-eofch
b060: 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ar", Tcl_DString
b070: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
b080: 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20  nelEOFChar));.  
b090: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b0a0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b0b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b0c0: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f  -blocking", Tcl_
b0d0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b0e0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
b0f0: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ng));.    Tcl_DS
b100: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
b110: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
b120: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
b130: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
b140: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
b150: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
b160: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b170: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
b180: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b190: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
b1a0: 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a  cking);..    /*.
b1b0: 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69       * SSL Initi
b1c0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a  alization.     *
b1d0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
b1e0: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74  ssl = SSL_new(st
b1f0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
b200: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d    if (!statePtr-
b210: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20  >ssl) {../* SSL 
b220: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f  library error */
b230: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b240: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
b250: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73  dn't construct s
b260: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47  sl session: ", G
b270: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
b280: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b290: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b2a0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b2b0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b2c0: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22  "INIT", "FAILED"
b2d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b2e0: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69  ;..Tls_Free((voi
b2f0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
b300: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b310: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b320: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
b330: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
b340: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
b350: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
b360: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
b370: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e  n (SNI) in Clien
b380: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e  tHello extension
b390: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20   */../* Per RFC 
b3a0: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69  6066, hostname i
b3b0: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65  s a ASCII encode
b3c0: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68  d string, though
b3d0: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55   RFC 4366 says U
b3e0: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53  TF-8. */..if (!S
b3f0: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
b400: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72  st_name(statePtr
b410: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b420: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b  e) && require) {
b430: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b440: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b450: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  Set SNI extensio
b460: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  n failed: ", GET
b470: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b480: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b490: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b4a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b4b0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53  S", "IMPORT", "S
b4c0: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  NI", "FAILED", (
b4d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b4e0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f      Tls_Free((vo
b4f0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
b500: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b510: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  ERROR;..}.../* S
b520: 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20  et hostname for 
b530: 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65  peer certificate
b540: 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69   hostname verifi
b550: 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74  cation in client
b560: 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65  s...   Don't use
b570: 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73   SSL_set1_host s
b580: 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69  ince it has limi
b590: 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20  tations. */..if 
b5a0: 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28  (!SSL_add1_host(
b5b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
b5c0: 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20  ervername)) {.. 
b5d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b5e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
b5f0: 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61   DNS hostname fa
b600: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
b610: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b620: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b630: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b640: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b650: 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e  "IMPORT", "HOSTN
b660: 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  AME", "FAILED", 
b670: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b680: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76  .    Tls_Free((v
b690: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
b6a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b6b0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b6c0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b6d0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b6e0: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b6f0: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b700: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b710: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b720: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b730: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b740: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b750: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b760: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b770: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
b780: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
b790: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
b7a0: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
b7b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b7c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b7d0: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66  Resume session f
b7e0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b7f0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b800: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b810: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b820: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b830: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53   "IMPORT", "SESS
b840: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  ION", "FAILED", 
b850: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b860: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76  .    Tls_Free((v
b870: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
b880: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b890: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b8a0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20  ..    /* Enable 
b8b0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65  Application-Laye
b8c0: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  r Protocol Negot
b8d0: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73  iation. Examples
b8e0: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a   are: http/1.0,.
b8f0: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  .http/1.1, h2, h
b900: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f  3, ftp, imap, po
b910: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c  p3, xmpp-client,
b920: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71   xmpp-server, mq
b930: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f  tt, irc, etc. */
b940: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b  .    if (alpn) {
b950: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
b960: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
b970: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
b980: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
b990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
b9a0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
b9b0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
b9c0: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
b9d0: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
b9e0: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
b9f0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
ba00: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
ba10: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26  (interp, alpn, &
ba20: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54  cnt, &list) != T
ba30: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c  CL_OK) {..    Tl
ba40: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73  s_Free((void *)s
ba50: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
ba60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ba70: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
ba80: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
ba90: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
baa0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bab0: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
bac0: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
bad0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
bae0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
baf0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
bb00: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
bb10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bb20: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
bb30: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f  otocol names too
bb40: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29   long", (char *)
bb50: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65   NULL);...Tcl_Se
bb60: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
bb70: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
bb80: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
bb90: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
bba0: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
bbb0: 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74  ((void *)statePt
bbc0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  r);...return TCL
bbd0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
bbe0: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b      protos_len +
bbf0: 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b  = 1 + (int) len;
bc00: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74  ..}.../* Build t
bc10: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74  he complete prot
bc20: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72  ocol-list */..pr
bc30: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70  otos = ckalloc(p
bc40: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20  rotos_len);../* 
bc50: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63  protocol-lists c
bc60: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20  onsist of 8-bit 
bc70: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c  length-prefixed,
bc80: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f   byte strings */
bc90: 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20  ..for (j = 0, p 
bca0: 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e  = protos; j < cn
bcb0: 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63  t; j++) {..    c
bcc0: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47  har *str = Tcl_G
bcd0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
bce0: 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a  list[j], &len);.
bcf0: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73  .    *p++ = (uns
bd00: 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b  igned char) len;
bd10: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ..    memcpy(p, 
bd20: 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  str, (size_t) le
bd30: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65  n);..    p += le
bd40: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73  n;..}.../* SSL_s
bd50: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d  et_alpn_protos m
bd60: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74  akes a copy of t
bd70: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  he protocol-list
bd80: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68   */../* Note: Th
bd90: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76  is functions rev
bda0: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e  erses the return
bdb0: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f   value conventio
bdc0: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65  n */..if (SSL_se
bdd0: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74  t_alpn_protos(st
bde0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f  atePtr->ssl, pro
bdf0: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29  tos, protos_len)
be00: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
be10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
be20: 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74  , "Set ALPN prot
be30: 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c  ocols failed: ",
be40: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
be50: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
be60: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
be70: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
be80: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
be90: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
bea0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
beb0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
bec0: 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  e((void *)stateP
bed0: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
bee0: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
bef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bf00: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
bf10: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
bf20: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bf30: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
bf40: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
bf50: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
bf60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
bf70: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
bf80: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
bf90: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
bfa0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
bfb0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
bfc0: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
bfd0: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
bfe0: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
bff0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c000: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
c010: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
c020: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
c030: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
c040: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
c050: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73  back);.    SSL_s
c060: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b  et_info_callback
c070: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c080: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  InfoCallback);..
c090: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
c0a0: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72  for observing pr
c0b0: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20  otocol messages 
c0c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
c0d0: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
c0e0: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f      /* void SSL_
c0f0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
c100: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74  back_arg(statePt
c110: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
c120: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76  statePtr);.    v
c130: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
c140: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
c150: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73  tePtr->ctx, Mess
c160: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f  ageCallback); */
c170: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67  .    SSL_set_msg
c180: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
c190: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
c1a0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c1b0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
c1c0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c1d0: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43  r->ssl, MessageC
c1e0: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66  allback);.#endif
c1f0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
c200: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20  Tcl_Channel BIO 
c210: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73  Handler */.    s
c220: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d  tatePtr->p_bio.=
c230: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61   BIO_new_tcl(sta
c240: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  tePtr, BIO_NOCLO
c250: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  SE);.    statePt
c260: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  r->bio.= BIO_new
c270: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a  (BIO_f_ssl());..
c280: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20      if (server) 
c290: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c  {../* Server cal
c2a0: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43  lbacks */..SSL_C
c2b0: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65  TX_set_tlsext_se
c2c0: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61  rvername_arg(sta
c2d0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
c2e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c2f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
c300: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61  xt_servername_ca
c310: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
c320: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63  >ctx, SNICallbac
c330: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  k);..SSL_CTX_set
c340: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62  _client_hello_cb
c350: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c360: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  HelloCallback, (
c370: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c380: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  ;..if (statePtr-
c390: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
c3a0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
c3b0: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f  set_alpn_select_
c3c0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c3d0: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
c3e0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c3f0: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  );.#ifdef USE_NP
c400: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f  N..    if (tls1_
c410: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33  2 == 0 && tls1_3
c420: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43   == 0) {...SSL_C
c430: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c440: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62  os_advertised_cb
c450: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c460: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  NPNCallback, (vo
c470: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c480: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d  .    }.#endif..}
c490: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72  .../* Enable ser
c4a0: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74  ver to send cert
c4b0: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68   request after h
c4c0: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e  andshake (TLS 1.
c4d0: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41  3 only) */../* A
c4e0: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
c4f0: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65   must take place
c500: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69   for the Certifi
c510: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20  cate Request to 
c520: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74  be..   sent to t
c530: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20  he client, this 
c540: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68  can be done with
c550: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b   SSL_do_handshak
c560: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  e(). */..if (req
c570: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
c580: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33  dshake && tls1_3
c590: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72  ) {..    SSL_ver
c5a0: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f  ify_client_post_
c5b0: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50  handshake(stateP
c5c0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f  tr->ssl);..}.../
c5d0: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20  * set automatic 
c5e0: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20  curve selection 
c5f0: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68  */..SSL_set_ecdh
c600: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e  _auto(statePtr->
c610: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65  ssl, 1);.../* Se
c620: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
c630: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
c640: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
c650: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
c660: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
c670: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c680: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
c690: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
c6a0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c6b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c6c0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
c6d0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c6e0: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
c6f0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
c700: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
c710: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c720: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c730: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c740: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
c750: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
c760: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
c770: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
c780: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
c790: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
c7a0: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
c7b0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
c7c0: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
c7d0: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
c7e0: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
c7f0: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
c800: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
c810: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
c820: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
c830: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
c840: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
c850: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
c860: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c870: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
c880: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
c890: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
c8a0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
c8b0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
c8c0: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
c8d0: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
c8e0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
c8f0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  l);.    }.    SS
c900: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50  L_set_bio(stateP
c910: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74  tr->ssl, statePt
c920: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50  r->p_bio, stateP
c930: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20  tr->p_bio);.    
c940: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74  BIO_set_ssl(stat
c950: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65  ePtr->bio, state
c960: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f  Ptr->ssl, BIO_NO
c970: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a  CLOSE);..    /*.
c980: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53       * End of SS
c990: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20  L Init.     */. 
c9a0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
c9b0: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47  rning %s", Tcl_G
c9c0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
c9d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
c9e0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c9f0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
ca00: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
ca10: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
ca20: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
ca30: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ILE);..    retur
ca40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
ca50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
ca60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69  ------. *. * Uni
caa0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
cab0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
cac0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
cad0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70  o remove the top
cae0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c  most channel fil
caf0: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
cb00: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
cb10: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
cb20: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
cb30: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
cb40: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
cb50: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
cb60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
cb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
cbb0: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f  ic int.UnimportO
cbc0: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55  bjCmd(.    TCL_U
cbd0: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20  NUSED(void *),. 
cbe0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
cbf0: 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f  nterp,.    int o
cc00: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  bjc,.    Tcl_Obj
cc10: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a   *const objv[]).
cc20: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
cc30: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
cc40: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
cc50: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20   mode on. */..  
cc60: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
cc70: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
cc80: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
cc90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cca0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
ccb0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
ccc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ccd0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
cce0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
ccf0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
cd00: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
cd10: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
cd20: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
cd30: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
cd40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cd50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
cd60: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20   * Make sure to 
cd70: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
cd80: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20  opmost channel. 
cd90: 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20      */.    chan 
cda0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
cdb0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
cdc0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
cdd0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
cde0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
cdf0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ce00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ce10: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
ce20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ce30: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
ce40: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
ce50: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  nel", (char *)NU
ce60: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
ce70: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
ce80: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50  p, "TLS", "UNIMP
ce90: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
cea0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
ceb0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
cec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ced0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
cee0: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c  l_UnstackChannel
cef0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d  (interp, chan) =
cf00: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
cf10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cf20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
cf30: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
cf40: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
cf90: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
cfa0: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
cfb0: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
cfc0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
cfd0: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
cfe0: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
cff0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d000: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
d010: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
d020: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
d070: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
d080: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
d090: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
d0a0: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
d0b0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
d0c0: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
d0d0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
d0e0: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
d0f0: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74   char *cert, int
d100: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65   key_len, int ce
d110: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  rt_len, char *CA
d120: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a  path,.    char *
d130: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69  CAfile, char *ci
d140: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70  phers, char *cip
d150: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c  hersuites, int l
d160: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61  evel, char *DHpa
d170: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f  rams) {.    Tcl_
d180: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
d190: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
d1a0: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
d1b0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
d1c0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
d1d0: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c      int off = 0,
d1e0: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   abort = 0;.    
d1f0: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65  int load_private
d200: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  _key;.    const 
d210: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68  SSL_METHOD *meth
d220: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  od;..    dprintf
d230: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
d240: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09   if (!proto) {..
d250: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d260: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
d270: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
d280: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  cted", (char *) 
d290: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d2a0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
d2b0: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f  /* create SSL co
d2c0: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45  ntext */.#if OPE
d2d0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
d2e0: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30  BER >= 0x1010000
d2f0: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f  0L || defined(NO
d300: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL2) || define
d310: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d320: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
d330: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d340: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63  OTO_SSL2)) {..Tc
d350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d360: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f  nterp, "SSL2 pro
d370: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d380: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
d390: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d3a0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d3b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d3c0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
d3d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d3e0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d3f0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d400: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c  TO_SSL3)) {..Tcl
d410: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d420: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74  terp, "SSL3 prot
d430: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d440: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d450: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d460: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d470: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d480: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
d490: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d4a0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d4b0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d4c0: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f  O_TLS1)) {..Tcl_
d4d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d4e0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72  erp, "TLS 1.0 pr
d4f0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d500: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d510: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d520: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d530: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d540: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
d550: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d560: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45  LS1_1).    if (E
d570: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d580: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29  S_PROTO_TLS1_1))
d590: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d5a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d5b0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.1 protocol n
d5c0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d5d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d5e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d5f0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d600: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d610: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d620: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
d630: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d640: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d650: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
d660: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d670: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
d680: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d690: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d6a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d6b0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d6c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d6d0: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
d6e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d6f0: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45  LS1_3).    if (E
d700: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d710: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29  S_PROTO_TLS1_3))
d720: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d730: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d740: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.3 protocol n
d750: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d760: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d770: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d780: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
d790: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a   (proto == 0) {.
d7a0: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e  ./* Use full ran
d7b0: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ge */..SSL_CTX_s
d7c0: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72  et_min_proto_ver
d7d0: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53  sion(ctx, 0);..S
d7e0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
d7f0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
d800: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
d810: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20   switch (proto) 
d820: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
d830: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d840: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
d850: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d860: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d870: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
d880: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d890: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  SSL2:..method = 
d8a0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32  isServer ? SSLv2
d8b0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d8c0: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f   : SSLv2_client_
d8d0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d8e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d8f0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
d900: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d910: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
d920: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d930: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
d940: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d950: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64  TO_SSL3:..method
d960: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
d970: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv3_server_metho
d980: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65  d() : SSLv3_clie
d990: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d9a0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d9b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d9c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d9d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
d9e0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d9f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
da00: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
da10: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74  PROTO_TLS1:..met
da20: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
da30: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65   TLSv1_server_me
da40: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63  thod() : TLSv1_c
da50: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
da60: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
da70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
da80: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
da90: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
daa0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
dab0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dac0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
dad0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
dae0: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_1:..method =
daf0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
db00: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_1_server_metho
db10: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c  d() : TLSv1_1_cl
db20: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
db30: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
db40: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
db50: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
db60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
db70: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
db80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
db90: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _2_METHOD).    c
dba0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
dbb0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_2:..method = 
dbc0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
dbd0: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _2_server_method
dbe0: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69  () : TLSv1_2_cli
dbf0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
dc00: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
dc10: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
dc20: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
dc30: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dc40: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  _3).    case TLS
dc50: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09  _PROTO_TLS1_3:..
dc60: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72  /* Use the gener
dc70: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f  ic method and co
dc80: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61  nstraint range a
dc90: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20  fter context is 
dca0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68  created */..meth
dcb0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
dcc0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
dcd0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
dce0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
dcf0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
dd00: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74  fault:../* Negot
dd10: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61  iate highest ava
dd20: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76  ilable SSL/TLS v
dd30: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f  ersion */..metho
dd40: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
dd50: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
dd60: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
dd70: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50  method();.#if OP
dd80: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
dd90: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
dda0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
ddb0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
ddc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
ddd0: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL2)..off |= (EN
dde0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
ddf0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f  _PROTO_SSL2)   ?
de00: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
de10: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv2);.#endif.#i
de20: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
de30: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
de40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
de50: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
de60: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
de70: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
de80: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
de90: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dea0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
deb0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dec0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66  SSL_NO_TLS1)..of
ded0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
dee0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
def0: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  LS1)   ? 0 : SSL
df00: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23  _OP_NO_TLSv1);.#
df10: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
df20: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
df30: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
df40: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66  L_NO_TLS1_1)..of
df50: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
df60: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
df70: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_1) ? 0 : SSL
df80: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b  _OP_NO_TLSv1_1);
df90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dfa0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
dfb0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dfc0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09  SSL_NO_TLS1_2)..
dfd0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dfe0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dff0: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53  _TLS1_2) ? 0 : S
e000: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32  SL_OP_NO_TLSv1_2
e010: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
e020: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
e030: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e040: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
e050: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
e060: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
e070: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a  TO_TLS1_3) ? 0 :
e080: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
e090: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65  _3);.#endif..bre
e0a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  ak;.    }..    E
e0b0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
e0c0: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  ;..    ctx = SSL
e0d0: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
e0e0: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20  ;.    if (!ctx) 
e0f0: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  {..return(NULL);
e100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
e110: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47  getenv(SSLKEYLOG
e120: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54  FILE)) {..SSL_CT
e130: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c  X_set_keylog_cal
e140: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f  lback(ctx, KeyLo
e150: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  gCallback);.    
e160: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
e170: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e180: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e190: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
e1a0: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50   (proto == TLS_P
e1b0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09  ROTO_TLS1_3) {..
e1c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
e1d0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
e1e0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
e1f0: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  N);..SSL_CTX_set
e200: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
e210: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
e220: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23  ERSION);.    }.#
e230: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f  endif..    /* Fo
e240: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63  rce cipher selec
e250: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65  tion order by se
e260: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  rver */.    if (
e270: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53  !isServer) {..SS
e280: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
e290: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49  s(ctx, SSL_OP_CI
e2a0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46  PHER_SERVER_PREF
e2b0: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a  ERENCE);.    }..
e2c0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e2d0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
e2e0: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65  0100000L.    Ope
e2f0: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67  nSSL_add_all_alg
e300: 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f  orithms(); /* Lo
e310: 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64  ad ciphers and d
e320: 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66  igests */.#endif
e330: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
e340: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20  t_app_data(ctx, 
e350: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09  (void*)interp);.
e360: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20  /* remember the 
e370: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
e380: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f     SSL_CTX_set_o
e390: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f  ptions(ctx, SSL_
e3a0: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20  OP_ALL);./* all 
e3b0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75  SSL bug workarou
e3c0: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  nds */.    SSL_C
e3d0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
e3e0: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f  tx, SSL_OP_NO_CO
e3f0: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64  MPRESSION);./* d
e400: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69  isable compressi
e410: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f  on even if suppo
e420: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  rted */.    SSL_
e430: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e440: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64  ctx, off);../* d
e450: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20  isable protocol 
e460: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20  versions */.#if 
e470: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
e480: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
e490: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58  000L.    SSL_CTX
e4a0: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53  _set_mode(ctx, S
e4b0: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54  SL_MODE_AUTO_RET
e4c0: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e  RY);./* handle n
e4d0: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e  ew handshakes in
e4e0: 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20   background. On 
e4f0: 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70  by default in Op
e500: 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a  enSSL 1.1.1. */.
e510: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43  #endif.    SSL_C
e520: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68  TX_sess_set_cach
e530: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29  e_size(ctx, 128)
e540: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73  ;..    /* Set us
e550: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65  er defined ciphe
e560: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65  rs, cipher suite
e570: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20  s, and security 
e580: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
e590: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c  ((ciphers != NUL
e5a0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
e5b0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63  et_cipher_list(c
e5c0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a  tx, ciphers)) {.
e5d0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e5e0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
e5f0: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e  iphers failed: N
e600: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22  o valid ciphers"
e610: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e620: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e630: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e640: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
e650: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20   ((ciphersuites 
e660: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c  != NULL) && !SSL
e670: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73  _CTX_set_ciphers
e680: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65  uites(ctx, ciphe
e690: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c  rsuites)) {..Tcl
e6a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e6b0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65  terp, "Set ciphe
e6c0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a  r suites failed:
e6d0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
e6e0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
e6f0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
e700: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
e710: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
e720: 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79   /* Set security
e730: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
e740: 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20   (level > -1 && 
e750: 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a  level < 6) {../*
e760: 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74   SSL_set_securit
e770: 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f  y_level */..SSL_
e780: 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79  CTX_set_security
e790: 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65  _level(ctx, leve
e7a0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  l);.    }..    /
e7b0: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62  * set some callb
e7c0: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  acks */.    SSL_
e7d0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
e7e0: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50  passwd_cb(ctx, P
e7f0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29  asswordCallback)
e800: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ;.    SSL_CTX_se
e810: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
e820: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78  _cb_userdata(ctx
e830: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
e840: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61  tr);..    /* rea
e850: 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d  d a Diffie-Hellm
e860: 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69  an parameters fi
e870: 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62  le, or use the b
e880: 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23  uilt-in one */.#
e890: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f  ifdef OPENSSL_NO
e8a0: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61  _DH.    if (DHpa
e8b0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rams != NULL) {.
e8c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e8d0: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61  t(interp, "DH pa
e8e0: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20  rameter support 
e8f0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20  not available", 
e900: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e910: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e920: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
e930: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
e940: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66    {..DH* dh;..if
e950: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
e960: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a  LL) {..    BIO *
e970: 62 69 6f 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20  bio;..    bio = 
e980: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e  BIO_new_file(F2N
e990: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c  (DHparams, &ds),
e9a0: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28   "r");..    if (
e9b0: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53  !bio) {...Tcl_DS
e9c0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e9d0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e9e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
e9f0: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61  d not find DH pa
ea00: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20  rameters file", 
ea10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
ea20: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
ea30: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
ea40: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  LL;..    }...   
ea50: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62   dh = PEM_read_b
ea60: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c  io_DHparams(bio,
ea70: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
ea80: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65  L);..    BIO_fre
ea90: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c  e(bio);..    Tcl
eaa0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
eab0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29  );..    if (!dh)
eac0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
ead0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
eae0: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48  ould not read DH
eaf0: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d   parameters from
eb00: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
eb10: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
eb20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
eb30: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
eb40: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   }..    SSL_CTX_
eb50: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20  set_tmp_dh(ctx, 
eb60: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65  dh);..    DH_fre
eb70: 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  e(dh);...} else 
eb80: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65  {..    /* Use we
eb90: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61  ll known DH para
eba0: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65  meters that have
ebb0: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72   built-in suppor
ebc0: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a  t in OpenSSL */.
ebd0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
ebe0: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74  X_set_dh_auto(ct
ebf0: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41  x, 1)) {...Tcl_A
ec00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ec10: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65  rp, "Could not e
ec20: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74  nable set DH aut
ec30: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  o: ", GET_ERR_RE
ec40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ec50: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
ec60: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
ec70: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
ec80: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64   }..}.    }.#end
ec90: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f  if..    /* set o
eca0: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  ur certificate *
ecb0: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61  /.    load_priva
ecc0: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  te_key = 0;.    
ecd0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20  if (certfile != 
ece0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
ecf0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a  ivate_key = 1;..
ed00: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
ed10: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
ed20: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66  e(ctx, F2N(certf
ed30: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46  ile, &ds), SSL_F
ed40: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
ed50: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  0) {..    Tcl_DS
ed60: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
ed70: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ed80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
ed90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
eda0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
edb0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
edc0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
edd0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ede0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
edf0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
ee00: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
ee10: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  }..Tcl_DStringFr
ee20: 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20  ee(&ds);..    } 
ee30: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d  else if (cert !=
ee40: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
ee50: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
ee60: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
ee70: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e  _certificate_ASN
ee80: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c  1(ctx, cert_len,
ee90: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09   cert) <= 0) {..
eea0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
eeb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
eec0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
eed0: 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 45  ificate: ",...GE
eee0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
eef0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
ef00: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
ef10: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
ef20: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20  urn NULL;..}.   
ef30: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66   } else {..certf
ef40: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30  ile = (char*)X50
ef50: 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65  9_get_default_ce
ef60: 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20  rt_file();...if 
ef70: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
ef80: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
ef90: 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c  x, certfile, SSL
efa0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
efb0: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20  = 0) {.#if 0..  
efc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
efd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
efe0: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
eff0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
f000: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
f010: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
f020: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f030: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
f040: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f050: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
f060: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20  LL;.#endif..}.  
f070: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
f080: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20  our private key 
f090: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f  */.    if (load_
f0a0: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09  private_key) {..
f0b0: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
f0c0: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55  ULL && key == NU
f0d0: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69  LL) {..    keyfi
f0e0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
f0f0: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20  }...if (keyfile 
f100: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f110: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61  /* get the priva
f120: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  te key associate
f130: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74  d with this cert
f140: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
f150: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
f160: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65  ULL) {...keyfile
f170: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20   = certfile;..  
f180: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53    }...    if (SS
f190: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
f1a0: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46  eKey_file(ctx, F
f1b0: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29  2N(keyfile, &ds)
f1c0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
f1d0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  EM) <= 0) {...Tc
f1e0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f1f0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
f200: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
f210: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
f220: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
f230: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
f240: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
f250: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
f260: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f270: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
f280: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
f290: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69  ey file ", keyfi
f2a0: 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47  le, " ",...    G
f2b0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f2c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f2d0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
f2e0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
f2f0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
f300: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f310: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  (&ds);...} else 
f320: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29  if (key != NULL)
f330: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f   {..    if (SSL_
f340: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
f350: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59  ey_ASN1(EVP_PKEY
f360: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b  _RSA, ctx, key,k
f370: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
f380: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
f390: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
f3a0: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
f3b0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
f3c0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
f3d0: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
f3e0: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
f3f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f400: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
f410: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20  set public key: 
f420: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
f430: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f440: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
f450: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
f460: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
f470: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
f480: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
f490: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
f4a0: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
f4b0: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
f4c0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
f4d0: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
f4e0: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
f4f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f500: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
f510: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
f520: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
f530: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
f540: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
f550: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
f560: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f570: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f580: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
f590: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65     /* Set to use
f5a0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
f5b0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
f5c0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
f5d0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
f5e0: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20  icates. The.    
f5f0: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61   * verify path a
f600: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20  nd store can be 
f610: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f620: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
f630: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69  nv var. The veri
f640: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20  fy file can.    
f650: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e   * be overridden
f660: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f670: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
f680: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
f690: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
f6a0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
f6b0: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20  ) {..abort++;.  
f6c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
f6d0: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41  rides for the CA
f6e0: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
f6f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23   file */.    {.#
f700: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
f710: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
f720: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70  000000L..if (CAp
f730: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43  ath != NULL || C
f740: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
f750: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f760: 67 20 64 73 31 3b 0a 09 20 20 20 20 69 66 20 28  g ds1;..    if (
f770: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
f780: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
f790: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
f7a0: 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68  &ds), F2N(CApath
f7b0: 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62  , &ds1))) {...ab
f7c0: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
f7d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f7e0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
f7f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f800: 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65  s1);...    /* Se
f810: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f  t list of CAs to
f820: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20   send to client 
f830: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
f840: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69  a client certifi
f850: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  cate */..    /* 
f860: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f  https://sourcefo
f870: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75  rge.net/p/tls/bu
f880: 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f  gs/57/ */..    /
f890: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20  * XXX:TODO: Let 
f8a0: 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20  the user supply 
f8b0: 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74  values here inst
f8c0: 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67  ead of something
f8d0: 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20   that exists on 
f8e0: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a  the filesystem *
f8f0: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
f900: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
f910: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
f920: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
f930: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
f940: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
f950: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
f960: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
f970: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
f980: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
f990: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
f9a0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f9b0: 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28  ..}..#else..if (
f9c0: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20  CApath != NULL) 
f9d0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
f9e0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
f9f0: 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70  dir(ctx, F2N(CAp
fa00: 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09  ath, &ds))) {...
fa10: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
fa20: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
fa30: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69  Free(&ds);..}..i
fa40: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
fa50: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
fa60: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
fa70: 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  fy_file(ctx, F2N
fa80: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20  (CAfile, &ds))) 
fa90: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
faa0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
fab0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
fac0: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
fad0: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
fae0: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
faf0: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
fb00: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
fb10: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
fb20: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
fb30: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
fb40: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
fb50: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
fb60: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
fb70: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
fb80: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
fb90: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
fba0: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
fbb0: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
fbc0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
fbd0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ..}.#endif.    }
fbe0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78  ..    return ctx
fbf0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
fc40: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d  *. * StatusObjCm
fc50: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74  d -- return cert
fc60: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e  ificate for conn
fc70: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20  ected peer.. *. 
fc80: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
fc90: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
fca0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
fcb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
fcc0: 2e 0a 20 2a 0a 20 2a 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 2d  ----------------
fd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
fd10: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73  tatic int.Status
fd20: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
fd30: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
fd40: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
fd50: 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20  interp,.    int 
fd60: 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62  objc,.    Tcl_Ob
fd70: 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j.*const objv[])
fd80: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
fd90: 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39  atePtr;.    X509
fda0: 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f   *peer;.    Tcl_
fdb0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20  Obj *objPtr;.   
fdc0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
fdd0: 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61  n;.    char *cha
fde0: 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65  nnelName, *ciphe
fdf0: 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  rs;.    int mode
fe00: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
fe10: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
fe20: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
fe30: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  nt len;.    int 
fe40: 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  nid, res;..    d
fe50: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
fe60: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
fe70: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20  < 2 || objc > 3 
fe80: 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26  || (objc == 3 &&
fe90: 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   !strcmp(Tcl_Get
fea0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
feb0: 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09   "-local"))) {..
fec0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fed0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
fee0: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
fef0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
ff00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ff10: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
ff20: 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
ff30: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
ff40: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ff50: 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32  (objv[(objc == 2
ff60: 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 6c   ? 1 : 2)], (Tcl
ff70: 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a  _Size *) NULL);.
ff80: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
ff90: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
ffa0: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26  , channelName, &
ffb0: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
ffc0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
ffd0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
ffe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fff0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
10000 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
10010 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
10020 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
10030 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
10040 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
10050 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
10060 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
10070 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
10080 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
10090 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
100a0 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
100b0 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
100c0 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
100d0 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
100e0 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
100f0 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  ;..Tcl_SetErrorC
10100 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
10110 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48  ", "STATUS", "CH
10120 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
10130 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
10140 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
10150 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10160 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
10170 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  e *) Tcl_GetChan
10180 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
10190 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  chan);..    /* G
101a0 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
101b0 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20  or peer or self 
101c0 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
101d0 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20  == 2) {..peer = 
101e0 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72  SSL_get_peer_cer
101f0 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10200 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
10210 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53  lse {..peer = SS
10220 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74  L_get_certificat
10230 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
10240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47  ;.    }.    /* G
10250 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63  et X509 certific
10260 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ate info */.    
10270 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a  if (peer) {..obj
10280 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30  Ptr = Tls_NewX50
10290 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65  9Obj(interp, pee
102a0 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d  r);..if (objc ==
102b0 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f   2) {..    X509_
102c0 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20  free(peer);..   
102d0 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d   peer = NULL;..}
102e0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f  .    } else {..o
102f0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
10300 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
10310 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
10320 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  eer name */.    
10330 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10340 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65  rp, objPtr, "pee
10350 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30  rname", SSL_get0
10360 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50  _peername(stateP
10370 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20  tr->ssl), -1);. 
10380 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
10390 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
103a0 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f  sbits", SSL_get_
103b0 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74  cipher_bits(stat
103c0 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29  ePtr->ssl, NULL)
103d0 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20  );..    ciphers 
103e0 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74  = (char*)SSL_get
103f0 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
10400 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50  ->ssl);.    LAPP
10410 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10420 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
10430 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a  , ciphers, -1);.
10440 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
10450 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63  he X509 certific
10460 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79  ate presented by
10470 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20   the peer */.   
10480 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
10490 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
104a0 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35  rifyResult",..X5
104b0 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65  09_verify_cert_e
104c0 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f  rror_string(SSL_
104d0 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
104e0 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
104f0 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
10500 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20  Verify mode */. 
10510 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65     mode = SSL_ge
10520 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74  t_verify_mode(st
10530 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
10540 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53    if (mode && SS
10550 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b  L_VERIFY_NONE) {
10560 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10570 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76  terp, objPtr, "v
10580 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e  erifyMode", "non
10590 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65  e", -1);.    } e
105a0 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
105b0 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c  listObjPtr = Tcl
105c0 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
105d0 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20  ULL);..if (mode 
105e0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45  && SSL_VERIFY_PE
105f0 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  ER) {..    Tcl_L
10600 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10610 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
10620 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
10630 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c  tringObj("peer",
10640 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
10650 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
10660 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
10670 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54  R_CERT) {..    T
10680 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10690 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
106a0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
106b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61  NewStringObj("fa
106c0 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65  il if no peer ce
106d0 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  rt", -1));..}..i
106e0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
106f0 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
10700 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
10710 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10720 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
10730 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10740 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20  ringObj("client 
10750 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  once", -1));..}.
10760 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10770 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
10780 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54  DSHAKE) {..    T
10790 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
107a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
107b0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
107c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f  NewStringObj("po
107d0 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d  st handshake", -
107e0 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44  1));..}..LAPPEND
107f0 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
10800 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
10810 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20  ", listObjPtr). 
10820 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
10830 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a  ify mode depth *
10840 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  /.    LAPPEND_IN
10850 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
10860 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c  , "verifyDepth",
10870 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
10880 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e  depth(statePtr->
10890 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  ssl));..    /* R
108a0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
108b0 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
108c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e   result of the n
108d0 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20  egotiation */.  
108e0 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f    SSL_get0_alpn_
108f0 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74  selected(statePt
10900 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  r->ssl, &proto, 
10910 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45  &len);.    LAPPE
10920 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10930 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28  bjPtr, "alpn", (
10940 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54  char *)proto, (T
10950 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20  cl_Size) len);. 
10960 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10970 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10980 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67  protocol", SSL_g
10990 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65  et_version(state
109a0 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a  Ptr->ssl), -1);.
109b0 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f  .    /* Valid fo
109c0 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74  r non-RSA signat
109d0 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20  ure and TLS 1.3 
109e0 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
109f0 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 2) {..res = S
10a00 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e  SL_get_peer_sign
10a10 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
10a20 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
10a30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
10a40 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
10a50 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
10a60 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
10a70 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
10a80 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20  es) {nid = 0;}. 
10a90 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10aa0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10ab0 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67  signatureHashAlg
10ac0 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64  orithm", OBJ_nid
10ad0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
10ae0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
10af0 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  2) {..res = SSL_
10b00 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
10b10 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
10b20 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10b30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10b40 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10b50 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
10b60 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
10b70 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
10b80 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
10b90 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
10ba0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10bb0 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
10bc0 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  Type", OBJ_nid2l
10bd0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
10be0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10bf0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
10c00 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
10c10 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_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 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63  ---. *. * Connec
10c70 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d  tionInfoObjCmd -
10c80 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74  - return connect
10c90 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70  ion info from Op
10ca0 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73  enSSL.. *. * Res
10cb0 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20  ults:. *.A list 
10cc0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  of connection in
10cd0 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  fo.  *. *-------
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 2d 2d 0a 20 2a 2f  ------------. */
10d20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e  ..static int Con
10d30 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d  nectionInfoObjCm
10d40 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
10d50 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
10d60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10d70 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
10d80 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
10d90 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
10da0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10db0 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
10dc0 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
10dd0 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74  e on */.    Stat
10de0 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
10df0 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
10e00 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
10e10 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
10e20 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20  Ptr, *listPtr;. 
10e30 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
10e40 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
10e50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
10e60 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
10e70 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
10e80 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
10e90 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28  D *md;..    if (
10ea0 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
10eb0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10ec0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10ed0 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
10ee0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
10ef0 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
10f00 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
10f10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10f20 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10f30 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65  jv[1], (Tcl_Size
10f40 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b   *)NULL), NULL);
10f50 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
10f60 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
10f70 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54  ULL) {..return(T
10f80 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
10f90 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
10fa0 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
10fb0 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
10fc0 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
10fd0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
10fe0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
10ff0 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
11000 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
11010 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
11020 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
11030 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11040 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
11050 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
11060 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
11070 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
11080 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
11090 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
110a0 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
110b0 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
110c0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
110d0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
110e0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  LL);..return(TCL
110f0 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
11100 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
11110 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
11120 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  ULL);..    /* Co
11130 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f  nnection info */
11140 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
11150 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
11160 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
11170 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73  ata(chan);.    s
11180 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73  sl = statePtr->s
11190 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  sl;.    if (ssl 
111a0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63  != NULL) {../* c
111b0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20  onnection state 
111c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
111d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
111e0 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61  "state", SSL_sta
111f0 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
11200 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47  sl), -1);.../* G
11210 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64  et SNI requested
11220 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
11230 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11250 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67  rvername", SSL_g
11260 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
11270 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
11280 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d  PE_host_name), -
11290 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f  1);.../* Get pro
112a0 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  tocol */..LAPPEN
112b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
112c0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
112d0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
112e0 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f  n(ssl), -1);.../
112f0 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20  * Renegotiation 
11300 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50  allowed */..LAPP
11310 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11320 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f   objPtr, "renego
11330 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22  tiation_allowed"
11340 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65  , SSL_get_secure
11350 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73  _renegotiation_s
11360 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73  upport((SSL *) s
11370 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73  sl));.../* Get s
11380 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
11390 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
113a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
113b0 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
113c0 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79  SSL_get_security
113d0 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09  _level(ssl));...
113e0 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
113f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11400 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11410 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64   "session_reused
11420 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72  ", SSL_session_r
11430 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f  eused(ssl));.../
11440 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f  * Is server info
11450 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11460 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11470 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53  , "is_server", S
11480 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c  SL_is_server(ssl
11490 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53  ));.../* Is DTLS
114a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
114b0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
114c0 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c  , "is_dtls", SSL
114d0 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a  _is_dtls(ssl));.
114e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69      }..    /* Ci
114f0 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  pher info */.   
11500 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65   cipher = SSL_ge
11510 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72  t_current_cipher
11520 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63  (ssl);.    if (c
11530 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  ipher != NULL) {
11540 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49  ..char buf[BUFSI
11550 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62  Z] = {0};..int b
11560 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a  its, alg_bits;..
11570 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20  ./* Cipher name 
11580 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11590 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
115a0 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49  "cipher", SSL_CI
115b0 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69  PHER_get_name(ci
115c0 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  pher), -1);.../*
115d0 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70   RFC name of cip
115e0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
115f0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11600 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61  tr, "standard_na
11610 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  me", SSL_CIPHER_
11620 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
11630 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  pher), -1);.../*
11640 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66   OpenSSL name of
11650 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
11660 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11670 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c  objPtr, "openssl
11680 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f  _name", OPENSSL_
11690 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f  cipher_name(SSL_
116a0 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f  CIPHER_standard_
116b0 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d  name(cipher)), -
116c0 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20  1);.../* number 
116d0 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75  of secret bits u
116e0 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a  sed for cipher *
116f0 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49  /..bits = SSL_CI
11700 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69  PHER_get_bits(ci
11710 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29  pher, &alg_bits)
11720 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  ;..LAPPEND_INT(i
11730 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11740 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69  secret_bits", bi
11750 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  ts);..LAPPEND_IN
11760 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11770 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74  , "algorithm_bit
11780 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09  s", alg_bits);..
11790 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61  /* alg_bits is a
117a0 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74  ctual key secret
117b0 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69   bits. If use bi
117c0 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61  ts and secret (a
117d0 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64  lgorithm) bits d
117e0 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72  iffer,..   the r
117f0 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20  est of the bits 
11800 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20  are fixed, i.e. 
11810 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f  for limited expo
11820 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73  rt ciphers (bits
11830 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49   < 56) */.../* I
11840 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53  ndicates which S
11850 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  SL/TLS protocol 
11860 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65  version first de
11870 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72  fined the cipher
11880 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
11890 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
118a0 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20   "min_version", 
118b0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76  SSL_CIPHER_get_v
118c0 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20  ersion(cipher), 
118d0 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72  -1);.../* Cipher
118e0 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44   NID */..LAPPEND
118f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11900 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22  Ptr, "cipherNID"
11910 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11920 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11930 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63  get_cipher_nid(c
11940 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
11950 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11960 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65  p, objPtr, "dige
11970 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  stNID", (char *)
11980 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11990 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74  IPHER_get_digest
119a0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
119b0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
119c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
119d0 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44   "keyExchangeNID
119e0 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
119f0 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
11a00 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68  _get_kx_nid(ciph
11a10 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  er)), -1);..LAPP
11a20 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11a30 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74  objPtr, "authent
11a40 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68  icationNID", (ch
11a50 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
11a60 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61  SSL_CIPHER_get_a
11a70 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29  uth_nid(cipher))
11a80 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73  , -1);.../* mess
11a90 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  age authenticati
11aa0 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72  on code - Cipher
11ab0 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47   is AEAD (e.g. G
11ac0 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50  CM or ChaCha20/P
11ad0 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20  oly1305) or not 
11ae0 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63  */../* Authentic
11af0 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20  ated Encryption 
11b00 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  with associated 
11b10 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63  data (AEAD) chec
11b20 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  k */..LAPPEND_BO
11b30 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
11b40 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65  r, "cipher_is_ae
11b50 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  ad", SSL_CIPHER_
11b60 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29  is_aead(cipher))
11b70 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73  ;.../* Digest us
11b80 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53  ed during the SS
11b90 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20  L/TLS handshake 
11ba0 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63  when using the c
11bb0 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20  ipher. */..md = 
11bc0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68  SSL_CIPHER_get_h
11bd0 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28  andshake_digest(
11be0 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e  cipher);..LAPPEN
11bf0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11c00 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65  jPtr, "handshake
11c10 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20  _digest", (char 
11c20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64  *)EVP_MD_name(md
11c30 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
11c40 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
11c50 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
11c60 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  D */..LAPPEND_IN
11c70 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11c80 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28  , "cipher_id", (
11c90 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
11ca0 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b  get_id(cipher));
11cb0 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49  .../* Two-byte I
11cc0 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c  D used in the TL
11cd0 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68  S protocol of th
11ce0 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a  e given cipher *
11cf0 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  /..LAPPEND_INT(i
11d00 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11d10 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69  protocol_id", (i
11d20 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
11d30 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63  et_protocol_id(c
11d40 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65  ipher));.../* Te
11d50 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f  xtual descriptio
11d60 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20  n of the cipher 
11d70 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  */..if (SSL_CIPH
11d80 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
11d90 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
11da0 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
11db0 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  ) {..    LAPPEND
11dc0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11dd0 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f  Ptr, "descriptio
11de0 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d  n", buf, -1);..}
11df0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
11e00 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
11e10 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c     session = SSL
11e20 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c  _get_session(ssl
11e30 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69  );.    if (sessi
11e40 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  on != NULL) {..c
11e50 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11e60 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a  ar *ticket;..siz
11e70 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67  e_t len2;..unsig
11e80 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63  ned int ulen;..c
11e90 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11ea0 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20  ar *session_id, 
11eb0 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65  *proto;..unsigne
11ec0 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53  d char buffer[SS
11ed0 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
11ee0 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52  _LENGTH];.../* R
11ef0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
11f00 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
11f10 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41   result of the A
11f20 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  LPN negotiation 
11f30 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
11f40 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
11f50 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f  ed(session, &pro
11f60 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  to, &len2);..LAP
11f70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11f80 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
11f90 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c   (char *) proto,
11fa0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
11fb0 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  );.../* Report t
11fc0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
11fd0 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
11fe0 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f   of the NPN nego
11ff0 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65  tiation */.#ifde
12000 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67  f USE_NPN..SSL_g
12010 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e  et0_next_proto_n
12020 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26  egotiated(ssl, &
12030 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09  proto, &ulen);..
12040 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12050 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e  rp, objPtr, "npn
12060 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74  ", (char *) prot
12070 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  o, (Tcl_Size) ul
12080 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  en);.#endif.../*
12090 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69   Resumable sessi
120a0 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  on */..LAPPEND_B
120b0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
120c0 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c  tr, "resumable",
120d0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f   SSL_SESSION_is_
120e0 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f  resumable(sessio
120f0 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
12100 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65  n start time (se
12110 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63  conds since epoc
12120 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c  h) */..LAPPEND_L
12130 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ONG(interp, objP
12140 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22  tr, "start_time"
12150 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
12160 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29  t_time(session))
12170 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76  ;.../* Timeout v
12180 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67  alue - SSL_CTX_g
12190 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73  et_timeout (in s
121a0 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50  econds) */..LAPP
121b0 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
121c0 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75   objPtr, "timeou
121d0 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  t", SSL_SESSION_
121e0 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73  get_timeout(sess
121f0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ion));.../* Sess
12200 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32  ion id - TLSv1.2
12210 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20   and below only 
12220 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
12230 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12240 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  _id(session, &ul
12250 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  en);..LAPPEND_BA
12260 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
12270 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64  Ptr, "session_id
12280 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
12290 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
122a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f  .../* Session co
122b0 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f  ntext */..sessio
122c0 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
122d0 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65  ON_get0_id_conte
122e0 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  xt(session, &ule
122f0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
12300 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12310 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e  tr, "session_con
12320 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69  text", session_i
12330 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  d, (Tcl_Size) ul
12340 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  en);.../* Sessio
12350 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e  n ticket - clien
12360 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53  t only */..SSL_S
12370 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
12380 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
12390 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
123a0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
123b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
123c0 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74  ssion_ticket", t
123d0 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
123e0 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65  ) len2);.../* Se
123f0 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66  ssion ticket lif
12400 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73  etime hint (in s
12410 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50  econds) */..LAPP
12420 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
12430 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69   objPtr, "lifeti
12440 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  me", SSL_SESSION
12450 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
12460 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
12470 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74  n));.../* Ticket
12480 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66   app data */.#if
12490 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
124a0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
124b0 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49  0000L..SSL_SESSI
124c0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61  ON_get0_ticket_a
124d0 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53  ppdata((SSL_SESS
124e0 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20  ION *) session, 
124f0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
12500 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
12510 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12520 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74   "ticket_app_dat
12530 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  a", ticket, (Tcl
12540 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65  _Size) len2);.#e
12550 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61  ndif.../* Get ma
12560 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e  ster key */..len
12570 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  2 = SSL_SESSION_
12580 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73  get_master_key(s
12590 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20  ession, buffer, 
125a0 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b  SSL_MAX_MASTER_K
125b0 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50  EY_LENGTH);..LAP
125c0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
125d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73  rp, objPtr, "mas
125e0 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72  ter_key", buffer
125f0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
12600 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73  2);.../* Compres
12610 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69  sion id */..unsi
12620 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53  gned int id = SS
12630 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f  L_SESSION_get_co
12640 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f  mpress_id(sessio
12650 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
12660 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12670 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64   "compression_id
12680 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c  ", id == 1 ? "zl
12690 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  ib" : "none", -1
126a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
126b0 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66   Compression inf
126c0 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c  o */.    if (ssl
126d0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64   != NULL) {.#ifd
126e0 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50  ef HAVE_SSL_COMP
126f0 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43  RESSION..const C
12700 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70  OMP_METHOD *comp
12710 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d  , *expn;..comp =
12720 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
12730 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c  _compression(ssl
12740 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67  );..expn = SSL_g
12750 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e  et_current_expan
12760 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50  sion(ssl);...LAP
12770 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12780 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12790 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53  ssion", comp ? S
127a0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
127b0 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c  (comp) : "none",
127c0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
127d0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
127e0 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
127f0 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  expn ? SSL_COMP_
12800 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a  get_name(expn) :
12810 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
12820 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  lse..LAPPEND_STR
12830 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12840 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
12850 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41  "none", -1);..LA
12860 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12870 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e  , objPtr, "expan
12880 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  sion", "none", -
12890 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
128a0 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20  ..    /* Server 
128b0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c  info */.    {..l
128c0 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43  ong mode = SSL_C
128d0 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_get_session_c
128e0 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
128f0 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20  tr->ctx);..char 
12900 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65  *msg;...if (mode
12910 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12920 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73  E_OFF) {..    ms
12930 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c  g = "off";..} el
12940 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12950 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49  L_SESS_CACHE_CLI
12960 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  ENT) {..    msg 
12970 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65  = "client";..} e
12980 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12990 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45  SL_SESS_CACHE_SE
129a0 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67  RVER) {..    msg
129b0 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20   = "server";..} 
129c0 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
129d0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42  SSL_SESS_CACHE_B
129e0 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  OTH) {..    msg 
129f0 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73  = "both";..} els
12a00 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  e {..    msg = "
12a10 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41  unknown";..}..LA
12a20 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12a30 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
12a40 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20  on_cache_mode", 
12a50 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  msg, -1);.    }.
12a60 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20  .    /* CA List 
12a70 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74  */.    /* IF not
12a80 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20   a server, same 
12a90 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72  as SSL_get0_peer
12aa0 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72  _CA_list. If ser
12ab0 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  ver same as SSL_
12ac0 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_get_client_C
12ad0 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69  A_list */.    li
12ae0 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
12af0 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
12b00 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
12b10 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73  09_NAME) *ca_lis
12b20 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c  t;.    if ((ca_l
12b30 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c  ist = SSL_get_cl
12b40 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c  ient_CA_list(ssl
12b50 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  )) != NULL) {..c
12b60 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49  har buffer[BUFSI
12b70 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  Z];..for (int i 
12b80 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39  = 0; i < sk_X509
12b90 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73  _NAME_num(ca_lis
12ba0 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  t); i++) {..    
12bb0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  X509_NAME *name 
12bc0 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76  = sk_X509_NAME_v
12bd0 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29  alue(ca_list, i)
12be0 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29  ;..    if (name)
12bf0 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f   {...X509_NAME_o
12c00 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66  neline(name, buf
12c10 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09  fer, BUFSIZ);...
12c20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12c30 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12c40 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
12c50 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
12c60 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  r, -1));..    }.
12c70 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  .}.    }.    LAP
12c80 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
12c90 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
12ca0 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  ", listPtr);.   
12cb0 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
12cc0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
12cd0 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58  ListCount", sk_X
12ce0 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
12cf0 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c  list));..    Tcl
12d00 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12d10 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
12d20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
12d30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
12d40 2d 2d 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 0a 20  --------------. 
12d80 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43  *. * VersionObjC
12d90 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72  md -- return ver
12da0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d  sion string from
12db0 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20   OpenSSL.. *. * 
12dc0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
12dd0 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
12de0 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
12df0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
12e00 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
12e50 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f  tic int.VersionO
12e60 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55  bjCmd(.    TCL_U
12e70 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20  NUSED(void *),. 
12e80 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
12e90 6e 74 65 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55  nterp,.    TCL_U
12ea0 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62  NUSED(int) /* ob
12eb0 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55  jc */,.    TCL_U
12ec0 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63  NUSED(Tcl_Obj *c
12ed0 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20  onst *) /* objv 
12ee0 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  */).{.    Tcl_Ob
12ef0 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
12f00 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
12f10 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
12f20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12f30 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  j(OPENSSL_VERSIO
12f40 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20  N_TEXT, -1);..  
12f50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
12f60 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
12f70 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
12f80 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
12fe0 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
12ff0 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
13000 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
13010 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
13020 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13030 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
13040 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
13090 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a  int.MiscObjCmd(.
130a0 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76      TCL_UNUSED(v
130b0 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f  oid *),.    Tcl_
130c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
130d0 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20      int objc,.  
130e0 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74    Tcl_Obj.*const
130f0 20 6f 62 6a 76 5b 5d 29 0a 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 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ];..    dprintf(
131b0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
131c0 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
131d0 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
131e0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
131f0 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f  v, "subcommand ?
13200 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  args?");..return
13210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13220 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
13230 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
13240 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63  terp, objv[1], c
13250 6f 6d 6d 61 6e 64 73 2c 0a 09 20 20 20 20 22 63  ommands,..    "c
13260 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29  ommand", 0,&cmd)
13270 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
13280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13290 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
132a0 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
132b0 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64      isStr = (cmd
132c0 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20   == C_STRREQ);. 
132d0 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d     switch ((enum
132e0 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b   command) cmd) {
132f0 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63  ..case C_REQ:..c
13300 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a  ase C_STRREQ: {.
13310 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70  .    EVP_PKEY *p
13320 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  key=NULL;..    X
13330 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a  509 *cert=NULL;.
13340 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
13350 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  name=NULL;..    
13360 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b  Tcl_Obj **listv;
13370 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c  ..    Tcl_Size l
13380 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49  istc,i;...    BI
13390 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
133a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b     const char *k
133b0 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a  _C="",*k_ST="",*
133c0 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a  k_L="",*k_O="",*
133d0 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22  k_OU="",*k_CN=""
133e0 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20  ,*k_Email="";.. 
133f0 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c     char *keyout,
13400 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20  *pemout,*str;.. 
13410 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73     int keysize,s
13420 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35  erial=0,days=365
13430 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
13440 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
13450 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
13460 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e   BIGNUM *bne = N
13470 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72  ULL;..    RSA *r
13480 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65  sa = NULL;.#else
13490 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43  ..    EVP_PKEY_C
134a0 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
134b0 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20  #endif...    if 
134c0 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62  ((objc<5) || (ob
134d0 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57  jc>6)) {...Tcl_W
134e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
134f0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65  rp, 2, objv, "ke
13500 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65  ysize keyfile ce
13510 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b  rtfile ?info?");
13520 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13530 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ROR;..    }...  
13540 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74    if (Tcl_GetInt
13550 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13560 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a  objv[2], &keysiz
13570 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  e) != TCL_OK) {.
13580 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13590 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
135a0 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  keyout=Tcl_GetSt
135b0 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09  ring(objv[3]);..
135c0 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47      pemout=Tcl_G
135d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
135e0 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74  );..    if (isSt
135f0 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61  r) {...Tcl_SetVa
13600 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
13610 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74  "",0);...Tcl_Set
13620 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
13630 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a  t,"",0);..    }.
13640 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d  ..    if (objc>=
13650 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c  6) {...if (Tcl_L
13660 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
13670 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35  s(interp, objv[5
13680 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ], &listc, &list
13690 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
136a0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
136b0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
136c0 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
136d0 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
136e0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
136f0 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
13700 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
13710 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
13720 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
13730 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13740 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
13750 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
13760 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
13770 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13780 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
13790 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
137a0 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
137b0 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
137c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
137d0 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
137e0 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
137f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13800 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13810 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
13820 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
13830 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
13840 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
13850 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
13860 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
13870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13880 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13890 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
138a0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d  ")==0) {....k_C=
138b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
138c0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
138d0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
138e0 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29  mp(str,"ST")==0)
138f0 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47   {....k_ST=Tcl_G
13900 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13910 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13920 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13930 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"L")==0) {....
13940 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_L=Tcl_GetStrin
13950 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13960 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13970 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d  strcmp(str,"O")=
13980 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c  =0) {....k_O=Tcl
13990 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
139a0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
139b0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
139c0 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a  str,"OU")==0) {.
139d0 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53  ...k_OU=Tcl_GetS
139e0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
139f0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13a00 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13a10 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  CN")==0) {....k_
13a20 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  CN=Tcl_GetString
13a30 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13a40 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13a50 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c  trcmp(str,"Email
13a60 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d  ")==0) {....k_Em
13a70 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  ail=Tcl_GetStrin
13a80 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13a90 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
13aa0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
13ab0 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70  nterp,"Unknown p
13ac0 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b  arameter",NULL);
13ad0 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ....return TCL_E
13ae0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09  RROR;...    }...
13af0 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  }..    }..#if OP
13b00 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13b10 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13b20 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e  0L..    bne = BN
13b30 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61  _new();..    rsa
13b40 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20   = RSA_new();.. 
13b50 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b     pkey = EVP_PK
13b60 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69  EY_new();..    i
13b70 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c  f (bne == NULL |
13b80 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | rsa == NULL ||
13b90 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   pkey == NULL ||
13ba0 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e   !BN_set_word(bn
13bb0 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21  e,RSA_F4) ||...!
13bc0 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79  RSA_generate_key
13bd0 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65  _ex(rsa, keysize
13be0 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20  , bne, NULL) || 
13bf0 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e  !EVP_PKEY_assign
13c00 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29  _RSA(pkey, rsa))
13c10 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
13c20 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52  ee(pkey);.../* R
13c30 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72  SA_free(rsa); fr
13c40 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f  eed by EVP_PKEY_
13c50 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65  free */...BN_fre
13c60 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20  e(bne);.#else.. 
13c70 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53     pkey = EVP_RS
13c80 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  A_gen((unsigned 
13c90 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09  int) keysize);..
13ca0 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b      ctx = EVP_PK
13cb0 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c  EY_CTX_new(pkey,
13cc0 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28  NULL);..    if (
13cd0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13ce0 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  ctx == NULL || !
13cf0 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f  EVP_PKEY_keygen_
13d00 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21  init(ctx) ||...!
13d10 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74  EVP_PKEY_CTX_set
13d20 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73  _rsa_keygen_bits
13d30 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c  (ctx, keysize) |
13d40 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
13d50 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20  en(ctx, &pkey)) 
13d60 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13d70 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50  e(pkey);...EVP_P
13d80 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78  KEY_CTX_free(ctx
13d90 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f  );.#endif...Tcl_
13da0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13db0 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
13dc0 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c  ng private key",
13dd0 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
13de0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
13df0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69  } else {...if (i
13e00 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
13e10 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
13e20 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
13e30 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
13e40 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
13e50 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
13e60 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d  ,NULL);...    i=
13e70 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
13e80 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
13e90 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
13ea0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
13eb0 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
13ec0 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
13ed0 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
13ee0 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
13ef0 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
13f00 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
13f10 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
13f20 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
13f30 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
13f40 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
13f50 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
13f60 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20  t,keyout);...   
13f70 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
13f80 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
13f90 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
13fa0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
13fb0 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69   /* PEM_write_bi
13fc0 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28  o_RSAPrivateKey(
13fd0 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20  out, rsa, NULL, 
13fe0 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e  NULL, 0, NULL, N
13ff0 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42  ULL); */...    B
14000 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
14010 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63  ;.. .}....if ((c
14020 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d  ert=X509_new())=
14030 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54  =NULL) {...    T
14040 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14050 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
14060 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ating certificat
14070 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29  e request",NULL)
14080 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
14090 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
140a0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
140b0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
140c0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
140d0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
140e0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
140f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09  L_ERROR);...}...
14100 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f  .X509_set_versio
14110 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e  n(cert,2);...ASN
14120 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35  1_INTEGER_set(X5
14130 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d  09_get_serialNum
14140 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c  ber(cert),serial
14150 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
14160 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
14170 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30  otBefore(cert),0
14180 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
14190 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
141a0 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c  otAfter(cert),(l
141b0 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79  ong)60*60*24*day
141c0 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70  s);...X509_set_p
141d0 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29  ubkey(cert,pkey)
141e0 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67  ;....name=X509_g
141f0 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
14200 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e  cert);....X509_N
14210 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
14220 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d  _txt(name,"C", M
14230 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
14240 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14250 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  r *) k_C, -1, -1
14260 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
14270 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14280 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
14290 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
142a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
142b0 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31   *) k_ST, -1, -1
142c0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
142d0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
142e0 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53  xt(name,"L", MBS
142f0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14300 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14310 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_L, -1, -1, 
14320 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14330 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14340 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52  (name,"O", MBSTR
14350 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14360 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14370 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_O, -1, -1, 0)
14380 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14390 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
143a0 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49  ame,"OU", MBSTRI
143b0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
143c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
143d0 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
143e0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
143f0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14400 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
14410 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14420 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14430 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_CN, -1, -1, 0)
14440 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14450 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14460 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53  ame,"Email", MBS
14470 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14480 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14490 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20  *) k_Email, -1, 
144a0 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f  -1, 0);....X509_
144b0 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  set_subject_name
144c0 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09  (cert,name);....
144d0 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63  if (!X509_sign(c
144e0 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61  ert,pkey,EVP_sha
144f0 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20  256())) {...    
14500 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
14510 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
14520 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
14530 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14540 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
14550 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
14560 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
14570 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
14580 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
14590 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66  r signing certif
145a0 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09  icate",NULL);...
145b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
145c0 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
145d0 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
145e0 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
145f0 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
14600 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
14610 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
14620 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f      i=BIO_read(o
14630 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66  ut,buffer,sizeof
14640 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20  (buffer)-1);... 
14650 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a     i=(i<0) ? 0 :
14660 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72   i;...    buffer
14670 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20  [i]='\0';...    
14680 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
14690 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c  p,pemout,buffer,
146a0 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c  0);...    BIO_fl
146b0 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20  ush(out);...    
146c0 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09  BIO_free(out);..
146d0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
146e0 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
146f0 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20  s_file());...   
14700 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e   BIO_write_filen
14710 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b  ame(out,pemout);
14720 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14730 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
14740 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  rt);...    BIO_f
14750 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09  ree_all(out);...
14760 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63  }....X509_free(c
14770 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  ert);...EVP_PKEY
14780 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
14790 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
147a0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
147b0 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28  0000L...BN_free(
147c0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20  bne);.#endif..  
147d0 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20    }..}..break;. 
147e0 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65     default:..bre
147f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ak;.    }.    re
14800 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
14810 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14820 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20  ******/./* Init 
14830 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f              */./
14840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14850 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
14860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14870 2d 2d 2d 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 0a  ---------------.
148a0 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d   *. * Tls_Free -
148b0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
148c0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70  cedure cleans up
148d0 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
148e0 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
148f0 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e  . *.is closed an
14900 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  d its reference 
14910 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f  count falls belo
14920 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  w 1. *. * Result
14930 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
14940 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14950 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
14960 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
14970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14980 2d 2d 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 0a 20  --------------. 
149b0 2a 2f 0a 76 6f 69 64 0a 23 69 66 20 54 43 4c 5f  */.void.#if TCL_
149c0 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20  MAJOR_VERSION > 
149d0 38 0a 54 6c 73 5f 46 72 65 65 28 20 76 6f 69 64  8.Tls_Free( void
149e0 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6c   *blockPtr ).#el
149f0 73 65 0a 54 6c 73 5f 46 72 65 65 28 20 63 68 61  se.Tls_Free( cha
14a00 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65  r *blockPtr ).#e
14a10 6e 64 69 66 0a 7b 0a 20 20 20 20 53 74 61 74 65  ndif.{.    State
14a20 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
14a30 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
14a40 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
14a50 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
14a60 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
14a70 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
14a80 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
14a90 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ad0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
14ae0 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
14af0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
14b00 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
14b10 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
14b20 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
14b30 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
14b40 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
14b50 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
14b60 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
14b70 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
14b80 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
14b90 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
14ba0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
14bb0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
14bc0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
14bd0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
14be0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14bf0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
14c00 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c40 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
14c50 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
14c60 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
14c70 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14c80 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
14c90 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
14ca0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
14cb0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
14cc0 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
14cd0 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
14ce0 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
14cf0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
14d00 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
14d10 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
14d20 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
14d30 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
14d40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
14d50 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14d60 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
14d70 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
14d80 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14d90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14da0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14db0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
14dc0 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
14dd0 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
14de0 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
14df0 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
14e00 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
14e10 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
14e20 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
14e30 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
14e40 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
14e50 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14e60 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
14e70 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
14e80 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
14e90 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
14ea0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
14eb0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
14ec0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14ed0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
14ee0 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
14ef0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
14f00 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
14f10 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14f20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
14f30 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
14f40 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
14f50 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
14f60 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
14f70 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
14f80 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14f90 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
14fa0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
14fb0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
14fc0 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
14fd0 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
14fe0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14ff0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
15000 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
15010 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
15020 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
15030 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
15040 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
15050 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
15060 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f 4d 41 4a  .}...#if TCL_MAJ
15070 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23  OR_VERSION > 8.#
15080 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49  define MIN_VERSI
15090 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23  ON "9.0".#else.#
150a0 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49  define MIN_VERSI
150b0 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a  ON "8.5".#endif.
150c0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
15110 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  Tls_Init --. *. 
15120 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b  *.This is a pack
15130 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  age initializati
15140 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68  on procedure, wh
15150 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a  ich is called. *
15160 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69  .by Tcl when thi
15170 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20  s package is to 
15180 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69  be added to an i
15190 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20  nterpreter.. *. 
151a0 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20  * Results:  Ssl 
151b0 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c  configured and l
151c0 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65  oaded. *. * Side
151d0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72   effects:. *. cr
151e0 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d  eate the ssl com
151f0 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65  mand, initialize
15200 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a   ssl context. *.
15210 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15250 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50  -----. */.DLLEXP
15260 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74  ORT int Tls_Init
15270 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
15280 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74  erp) {.    const
15290 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74   char tlsTclInit
152a0 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e  Script[] = {.#in
152b0 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68  clude "tls.tcl.h
152c0 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a  "..0x00.    };..
152d0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
152e0 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55  led");..#ifdef U
152f0 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
15300 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
15310 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56  bs(interp, MIN_V
15320 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
15330 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
15340 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
15350 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63  endif.    if (Tc
15360 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
15370 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f  erp, "Tcl", MIN_
15380 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e  VERSION, 0) == N
15390 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
153a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
153b0 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
153c0 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
153d0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
153e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
153f0 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
15400 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
15410 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
15420 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
15430 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
15440 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15450 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15460 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70  s::ciphers", Cip
15470 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 76 6f 69  hersObjCmd, (voi
15480 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  d *) NULL, (Tcl_
15490 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
154a0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
154b0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
154c0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63  (interp, "tls::c
154d0 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e  onnection", Conn
154e0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
154f0 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c  , (void *) NULL,
15500 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15510 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15520 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15530 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15540 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
15550 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
15560 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c  , (void *) NULL,
15570 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15580 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15590 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
155a0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
155b0 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d  tls::import", Im
155c0 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 76 6f 69  portObjCmd, (voi
155d0 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  d *) NULL, (Tcl_
155e0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
155f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15600 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15610 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75  (interp, "tls::u
15620 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f  nimport", Unimpo
15630 72 74 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20  rtObjCmd, (void 
15640 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  *) NULL, (Tcl_Cm
15650 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15660 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15670 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15680 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61  nterp, "tls::sta
15690 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43  tus", StatusObjC
156a0 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c  md, (void *) NUL
156b0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
156c0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
156d0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
156e0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
156f0 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
15700 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
15710 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28  (void *) NULL, (
15720 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15730 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15740 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15750 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15760 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62  s::misc", MiscOb
15770 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e  jCmd, (void *) N
15780 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15790 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
157a0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
157b0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
157c0 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  p, "tls::protoco
157d0 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  ls", ProtocolsOb
157e0 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e  jCmd, (void *) N
157f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15800 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15810 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72  ;..    if (inter
15820 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69  p) {..Tcl_Eval(i
15830 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
15840 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  tScript);.    }.
15850 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
15860 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
15870 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c  p, PACKAGE_NAME,
15880 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
15890 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66  -*. *. *.Tls_Saf
158e0 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  eInit --. *. *.-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15920 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f  . *.Standard pro
15930 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20  cedure required 
15940 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e  by 'load'.. *.In
15950 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65  itializes this e
15960 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73  xtension for a s
15970 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  afe interpreter.
15980 0a 20 2a 09 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 2d 2d 2d 2d 2d  ----------------
159b0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
159c0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73   effects:. *..As
159d0 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20   of 'Tls_Init'. 
159e0 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
159f0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
15a00 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20  error code.. *. 
15a10 2a 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 2d 2d  ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c  -------*. */..DL
15a50 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
15a60 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
15a70 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
15a80 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
15a90 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
15aa0 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  (Tls_Init(interp
15ab0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15af0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62  --*. *. *.TlsLib
15b00 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15b40 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53   *.Initializes S
15b50 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20  SL library once 
15b60 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  per application.
15b70 20 2a 09 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 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
15bb0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69  effects:. *..ini
15bc0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
15bd0 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c  rary. *. *.Resul
15be0 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20  t:. *..none. *. 
15bf0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61  -------*. */.sta
15c30 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e  tic int TlsLibIn
15c40 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
15c50 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69  ize) {.    stati
15c60 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
15c70 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  d = 0;.    int s
15c80 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  tatus = TCL_OK;.
15c90 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15ca0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15cb0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15cc0 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20  ADS).    size_t 
15cd0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69  num_locks;.#endi
15ce0 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69  f..    if (unini
15cf0 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28  tialize) {..if (
15d00 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
15d10 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
15d20 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15d30 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20  ize, but we are 
15d40 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22  not initialized"
15d50 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28  );...    return(
15d60 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70  TCL_OK);..}...dp
15d70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
15d80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
15d90 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15da0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15db0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15dc0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
15dd0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
15de0 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09  ..if (locks) {..
15df0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
15e00 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55  ..    locks = NU
15e10 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f  LL;..    locksCo
15e20 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64  unt = 0;..}.#end
15e30 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  if..initialized 
15e40 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
15e50 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15e60 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15e70 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
15e80 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
15e90 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
15ea0 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
15eb0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69      }..    if (i
15ec0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64  nitialized) {..d
15ed0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20  printf("Called, 
15ee0 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64  but using cached
15ef0 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72   value");..retur
15f00 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d  n(status);.    }
15f10 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
15f20 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
15f30 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
15f40 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
15f50 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
15f60 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
15f70 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
15f80 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  if.    initializ
15f90 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66  ed = 1;..#if def
15fa0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
15fb0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
15fc0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
15fd0 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b    num_locks = 1;
15fe0 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
15ff0 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b  = (int) num_lock
16000 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d  s;.    locks = m
16010 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f  alloc(sizeof(*lo
16020 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
16030 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f  );.    memset(lo
16040 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  cks, 0, sizeof(*
16050 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
16060 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ks);.#endif..   
16070 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42   /* Initialize B
16080 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e  OTH libcrypto an
16090 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20  d libssl. */.   
160a0 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73   OPENSSL_init_ss
160b0 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  l(OPENSSL_INIT_L
160c0 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20  OAD_SSL_STRINGS 
160d0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  | OPENSSL_INIT_L
160e0 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e  OAD_CRYPTO_STRIN
160f0 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  GS..| OPENSSL_IN
16100 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
16110 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
16120 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
16130 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  S, NULL);..    B
16140 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c  IO_new_tcl(NULL,
16150 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20   0);..#if 0.    
16160 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f  /*.     * XXX:TO
16170 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20  DO: Remove this 
16180 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
16190 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b   it with a check
161a0 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75  .     * for enou
161b0 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64  gh entropy and d
161c0 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65  o not try to cre
161d0 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20  ate our own.    
161e0 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72   * terrible entr
161f0 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  opy.     */.    
16200 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74  /*.     * Seed t
16210 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
16220 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68   generator in th
16230 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20  e SSL library,. 
16240 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20      * using the 
16250 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75  do/while constru
16260 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ct because of th
16270 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68  e bug note in th
16280 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c  e.     * OpenSSL
16290 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77   FAQ at http://w
162a0 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73  ww.openssl.org/s
162b0 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23  upport/faq.html#
162c0 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20  USER1.     *.   
162d0 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20    * The crux of 
162e0 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
162f0 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f  hat Solaris 7 do
16300 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20  es not have a.  
16310 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d     * /dev/random
16320 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d   or /dev/urandom
16330 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61   device so it ca
16340 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75  nnot gather enou
16350 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70  gh.     * entrop
16360 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f  y from the RAND_
16370 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20  seed() when TLS 
16380 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20  initializes and 
16390 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74  refuses.     * t
163a0 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61  o go further. Ea
163b0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
163c0 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65  f OpenSSL carrie
163d0 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e  d on regardless.
163e0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61  .     */.    sra
163f0 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  nd((unsigned int
16400 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a  ) time((time_t *
16410 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f  ) NULL));.    do
16420 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20   {..for (i = 0; 
16430 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09  i < 16; i++) {..
16440 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20      rnd_seed[i] 
16450 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35  = 1 + (char) (25
16460 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41  5.0 * rand()/(RA
16470 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d  ND_MAX+1.0));..}
16480 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f  ..RAND_seed(rnd_
16490 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64  seed, sizeof(rnd
164a0 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77  _seed));.    } w
164b0 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75  hile (RAND_statu
164c0 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69  s() != 1);.#endi
164d0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  f..#if defined(O
164e0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
164f0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16500 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
16510 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
16520 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  t_mx);.#endif.. 
16530 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73     return(status
16540 29 3b 0a 7d 0a                                   );.}.