Hex Artifact Content

Artifact 9c4ead6c3356ae607b388b65e2cbb67bf487fc679567df5e638e27decea4cc71:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
04f0: 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  *CTX_Init(State 
0500: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
0510: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
0520: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09  to, char *key,..
0530: 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c  .char *certfile,
0540: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0550: 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e  key_asn1, unsign
0560: 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73  ed char *cert_as
0570: 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73  n1,...int key_as
0580: 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74  n1_len, int cert
0590: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20  _asn1_len, char 
05a0: 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20 2a 43  *CApath, char *C
05b0: 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63  Afile,...char *c
05c0: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69  iphers, char *ci
05d0: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20  phersuites, int 
05e0: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70  level, char *DHp
05f0: 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20  arams);..static 
0600: 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69  int.TlsLibInit(i
0610: 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  nt uninitialize)
0620: 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  ;..#define TLS_P
0630: 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a  ROTO_SSL2..0x01.
0640: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0650: 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65  O_SSL3..0x02.#de
0660: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0670: 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e  LS1..0x04.#defin
0680: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
0690: 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20  _1.0x08.#define 
06a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
06b0: 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c  .0x10.#define TL
06c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30  S_PROTO_TLS1_3.0
06d0: 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42  x20.#define ENAB
06e0: 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09  LED(flag, mask).
06f0: 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b  (((flag) & (mask
0700: 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23  )) == (mask))..#
0710: 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47  define SSLKEYLOG
0720: 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47  FILE.."SSLKEYLOG
0730: 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 72  FILE"../*. * Thr
0740: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
0750: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
0760: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0770: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0780: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0790: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
07a0: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
07b0: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
07c0: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
07d0: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
07e0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
07f0: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0800: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
0810: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
0820: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
0830: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
0840: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
0850: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
0860: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0870: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0880: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0890: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
08a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
08b0: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
08c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
08d0: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
08e0: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
08f0: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0910: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
0920: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0940: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0990: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
09a0: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
09b0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
09c0: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
09d0: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
09e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
09f0: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a00: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0a10: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0a20: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0a30: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0a40: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0a50: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0a60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0a70: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0a80: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0ae0: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0af0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b00: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0b10: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0b20: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0b30: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0b40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
0b50: 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  d");..    Tcl_Pr
0b60: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
0b70: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
0b80: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
0b90: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
0ba0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  Ptr);..    /* Ev
0bb0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  al callback with
0bc0: 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20   success for ok 
0bd0: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  or return value 
0be0: 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f  1, fail for erro
0bf0: 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75  r or return valu
0c00: 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52  e 0 */.    Tcl_R
0c10: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
0c20: 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54  p);.    code = T
0c30: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
0c40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
0c50: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
0c60: 20 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c     dprintf("Eval
0c70: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63  Callback: %d", c
0c80: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  ode);.    if (co
0c90: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0ca0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0cb0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cc0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0cd0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0ce0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0cf0: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d00: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d10: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d20: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d30: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d40: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70    ok = 1;..}..dp
0d50: 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25  rintf("Result: %
0d60: 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65  d", ok);.    } e
0d70: 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20  lse {../* Error 
0d80: 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72  - reject the cer
0d90: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72  tificate */..dpr
0da0: 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72  intf("Tcl_Backgr
0db0: 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66  oundError");.#if
0dc0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
0dd0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
0de0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
0df0: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
0e00: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
0e10: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61  );.#else..Tcl_Ba
0e20: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f  ckgroundExceptio
0e30: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  n(interp, code);
0e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
0e50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
0e60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
0e70: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
0e80: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
0e90: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
0ea0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a   return ok;.}...
0eb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
0f00: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0f10: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
0f20: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0f30: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0f40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0f50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0f60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0f70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0f80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
0fd0: 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c  ic void.InfoCall
0fe0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
0ff0: 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20  ssl, int where, 
1000: 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53  int ret) {.    S
1010: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
1020: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74   (State*)SSL_get
1030: 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a  _app_data((SSL *
1040: 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49  )ssl);.    Tcl_I
1050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
1060: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1070: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
1080: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20  mdPtr;.    char 
1090: 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69  *major; char *mi
10a0: 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  nor;..    dprint
10b0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
10c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
10d0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
10e0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74  _Obj*)NULL)..ret
10f0: 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68  urn;..    if (wh
1100: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e  ere & SSL_CB_HAN
1110: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a  DSHAKE_START) {.
1120: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1130: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1140: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c  start";.    } el
1150: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1160: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f  SL_CB_HANDSHAKE_
1170: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  DONE) {..major =
1180: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1190: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20  inor = "done";. 
11a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
11b0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
11c0: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20  ALERT)..major = 
11d0: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69  "alert";..else i
11e0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
11f0: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72  T_CONNECT).major
1200: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65   = "connect";..e
1210: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1220: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09  SSL_ST_ACCEPT)..
1230: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22  major = "accept"
1240: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f  ;..else.....majo
1250: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a  r = "unknown";..
1260: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
1270: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72  _CB_READ)..minor
1280: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65   = "read";..else
1290: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
12a0: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f  _CB_WRITE)..mino
12b0: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c  r = "write";..el
12c0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
12d0: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e  SL_CB_LOOP)..min
12e0: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c  or = "loop";..el
12f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1300: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e  SL_CB_EXIT)..min
1310: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c  or = "exit";..el
1320: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22  se.....minor = "
1330: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a  unknown";.    }.
1340: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
1350: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
1360: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61  ith fn, chan, ma
1370: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73  jor, minor, mess
1380: 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72  age, and type ar
1390: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
13a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
13b0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13c0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13f0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
1400: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
1410: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1430: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1440: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1450: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1460: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1470: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1480: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1490: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
14b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14c0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1500: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
1510: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1520: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1530: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1540: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1550: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1560: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1570: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1580: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1590: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
15a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
15b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15c0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15e0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15f0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
1600: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
1610: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1630: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1640: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1650: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1660: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1670: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1680: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1690: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
16a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16b0: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16d0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16e0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16f0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
1700: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
1710: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1720: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1730: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1740: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1750: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
17a0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
17b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17c0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17d0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17f0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1800: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
1810: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1820: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1870: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1880: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1890: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
18a0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
18b0: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18c0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18d0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18e0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18f0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
1900: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
1910: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1920: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1930: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1940: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1950: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1960: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1970: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1980: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1990: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
19a0: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
19b0: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19f0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
1a00: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
1a10: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a20: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a30: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a40: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a50: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a70: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a80: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a90: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1aa0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1ab0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1ac0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ad0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ae0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1af0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1b00: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1b10: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b20: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b30: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b50: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b60: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b70: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b80: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b90: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1ba0: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1bb0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1bc0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bd0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1be0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bf0: 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09  .ver = "none";..
1c00: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1c10: 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e  lt:..ver = "unkn
1c20: 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  own";..break;.  
1c30: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
1c40: 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b  (content_type) {
1c50: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1c60: 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20  T_HEADER:..type 
1c70: 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65  = "Header";..bre
1c80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c90: 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45  3_RT_INNER_CONTE
1ca0: 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d  NT_TYPE:..type =
1cb0: 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20   "Inner Content 
1cc0: 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  Type";..break;. 
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1ce0: 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50  CHANGE_CIPHER_SP
1cf0: 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61  EC:..type = "Cha
1d00: 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72  nge Cipher";..br
1d10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1d20: 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79  L3_RT_ALERT:..ty
1d30: 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62  pe = "Alert";..b
1d40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d50: 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45  SL3_RT_HANDSHAKE
1d60: 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73  :..type = "Hands
1d70: 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  hake";..break;. 
1d80: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1d90: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41  APPLICATION_DATA
1da0: 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 44  :..type = "App D
1db0: 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69  ata";..break;.#i
1dc0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
1dd0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
1de0: 30 30 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20  00000L.    case 
1df0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1e00: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1e10: 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b  rtbeat";..break;
1e20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
1e30: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e40: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e50: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e60: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e70: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e80: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e90: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1ea0: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1eb0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1ec0: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ed0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1ee0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ef0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1f00: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1f10: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1f20: 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69  , BIO_pending(bi
1f30: 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f  o) < 15000 ? BIO
1f40: 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20  _pending(bio) : 
1f50: 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c  14999);..n = (n<
1f60: 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66  0) ? 0 : n;..buf
1f70: 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f  fer[n] = 0;..(vo
1f80: 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f  id)BIO_flush(bio
1f90: 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f  );..BIO_free(bio
1fa0: 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  );.   }..    /* 
1fb0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1fc0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1fd0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c  chan, direction,
1fe0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20   version, type, 
1ff0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
2000: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
2010: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
2020: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
2030: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
2040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2050: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2060: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2070: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2080: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2090: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20a0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
20b0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
20d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
20e0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
20f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2100: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2110: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2120: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2130: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
2140: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
2150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2180: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2190: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
21a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
21b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
21c0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
21d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
21e0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
21f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2200: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2210: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2220: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
2230: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
2240: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2250: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2260: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2270: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2280: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2290: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
22a0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
22b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
22c0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
2320: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2330: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
2340: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
2350: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
2360: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2370: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2380: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2390: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
23a0: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
23b0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
23c0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
23d0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
23e0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
23f0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2400: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2410: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
2420: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
2430: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
2440: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
2450: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
2460: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
2470: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2480: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2490: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
24a0: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
24b0: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
24c0: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
24d0: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
24e0: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
24f0: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2500: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2510: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
2520: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2530: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
2540: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
2550: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
2560: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
2570: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2580: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2590: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
25a0: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
25b0: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
25c0: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
25d0: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
25e0: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
25f0: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2600: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2610: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
2620: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
2630: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
2640: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
2650: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
2660: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
2670: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2680: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2690: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
26a0: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
26b0: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
26c0: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
26d0: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
26e0: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
26f0: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2700: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2710: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
2720: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
2730: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2740: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
2750: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
2760: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2770: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2780: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2790: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
27a0: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
27b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
27c0: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
27d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
27e0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
27f0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2800: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2810: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
2820: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
2830: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2880: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2890: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
28a0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
28b0: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
28c0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
28d0: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
28e0: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
28f0: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2900: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2910: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
2920: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
2930: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
2940: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2950: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
2960: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
2970: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2980: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2990: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
29a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
29b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
29c0: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
29d0: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
29e0: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
29f0: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2a00: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2a10: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
2a20: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
2a30: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
2a40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65  .    dprintf("Ve
2a50: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64  rifyCallback: %d
2a60: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20  ", ok);..    if 
2a70: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
2a80: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
2a90: 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20  L) {../* Use ok 
2aa0: 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63  value if verific
2ab0: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
2ac0: 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50  d */..if (stateP
2ad0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c  tr->vflags & SSL
2ae0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
2af0: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
2b00: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
2b10: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2b20: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20  eturn 1;..}.    
2b30: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
2b40: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d  == NULL || ssl =
2b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
2b60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
2b70: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43  dprintf("VerifyC
2b80: 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61  allback: eval ca
2b90: 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f  llback");..    /
2ba0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
2bb0: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
2bc0: 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63  , chan, depth, c
2bd0: 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73  ert info list, s
2be0: 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72  tatus, and error
2bf0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
2c00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
2c10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
2c20: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
2c30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2c50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2c60: 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20  ngObj("verify", 
2c70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2c80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2ca0: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r,..Tcl_NewStrin
2cb0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
2cc0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
2cd0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
2ce0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2cf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2d10: 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29  NewIntObj(depth)
2d20: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2d30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2d40: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2d50: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
2d60: 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20  nterp, cert));. 
2d70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d90: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2da0: 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a  NewIntObj(ok));.
2db0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2dc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2dd0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
2de0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
2df0: 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66  char*)X509_verif
2e00: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
2e10: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a  ing(err), -1));.
2e20: 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  .    /* Prevent 
2e30: 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61  I/O while callba
2e40: 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ck is in progres
2e50: 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74  s */.    /* stat
2e60: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
2e70: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b  LS_TCL_CALLBACK;
2e80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c   */..    /* Eval
2e90: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
2ea0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
2eb0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2ec0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c  );.    ok = Eval
2ed0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
2ee0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
2ef0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
2f00: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2f10: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2f20: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2f30: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d  command result =
2f40: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20   %d", ok);..    
2f50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2f60: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2f70: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20  CALLBACK); */.  
2f80: 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a    return(ok);./*
2f90: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61   By default, lea
2fa0: 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ve verification 
2fb0: 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a  unchanged. */.}.
2fc0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3010: 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a   Tls_Error --. *
3020: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3030: 63 6b 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20  ck with list of 
3040: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69  errors.. *. * Si
3050: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
3060: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
3070: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
3080: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
3090: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
30a0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
30b0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
30c0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
30d0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3120: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28  .void.Tls_Error(
3130: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
3140: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20   char *msg) {.  
3150: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3160: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3170: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3180: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c  _Obj *cmdPtr, *l
3190: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69  istPtr;.    unsi
31a0: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20  gned long err;. 
31b0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
31c0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72   = msg;..    dpr
31d0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
31e0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
31f0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
3200: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
3210: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  return;..    /* 
3220: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3230: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
3240: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67  chan, and messag
3250: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3260: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3270: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3280: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3290: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
32a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
32d0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
32e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
32f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3300: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
3310: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
3320: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
3330: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3340: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d   -1));.    if (m
3350: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sg != NULL) {..T
3360: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3370: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3380: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3390: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
33a0: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
33b0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47  if ((msg = Tcl_G
33c0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74  etString(Tcl_Get
33d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
33e0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
33f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3400: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3410: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3420: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3430: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3440: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3450: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3460: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
3470: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
3480: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
3490: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
34a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
34b0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
34c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
34d0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
34e0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
34f0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
3500: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3510: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3520: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3530: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3540: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3550: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3560: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3570: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
3580: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
3590: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
35a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
35b0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
35c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3610: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3620: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3630: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3640: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3650: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3660: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
36b0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
36c0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
36d0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
36e0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
36f0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
3700: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3710: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3720: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3730: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3740: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3750: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
3760: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
3770: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
3780: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
3790: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
37e0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
37f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3800: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3810: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b   for a private k
3820: 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69  ey loading/stori
3830: 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74  ng a PEM. *.cert
3840: 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63  ificate with enc
3850: 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63  ryption. Evals c
3860: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61  allback script a
3870: 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68  nd returns. *.th
3880: 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  e result as the 
3890: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
38a0: 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65  in buf.. *. * Re
38b0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
38c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
38d0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
38e0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
38f0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  ). *. * Returns:
3900: 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a  . *.Password siz
3910: 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31  e in bytes or -1
3920: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
3930: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3980: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
3990: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
39a0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
39b0: 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75   rwflag, void *u
39c0: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74  data) {.    Stat
39d0: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
39e0: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20  tate *) udata;. 
39f0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3a00: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
3a10: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
3a20: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
3a30: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20     int code;..  
3a40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3a50: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  d");..    /* If 
3a60: 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65  no callback, use
3a70: 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63   default callbac
3a80: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  k */.    if (sta
3a90: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
3aa0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  == NULL) {..if (
3ab0: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72  Tcl_EvalEx(inter
3ac0: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72  p, "tls::passwor
3ad0: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  d", -1, TCL_EVAL
3ae0: 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f  _GLOBAL) == TCL_
3af0: 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  OK) {..    char 
3b00: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3b10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3b20: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20  ult(interp);..  
3b30: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72    strncpy(buf, r
3b40: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a  et, (size_t) siz
3b50: 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e);..    return 
3b60: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29  (int)strlen(ret)
3b70: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
3b80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
3b90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
3ba0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
3bb0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66  val with fn, rwf
3bc0: 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72  lag, and size ar
3bd0: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
3be0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
3bf0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61  Obj(statePtr->pa
3c00: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c  ssword);.    Tcl
3c10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3c20: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3c30: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3c40: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64  ingObj("password
3c50: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3c60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3c70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3c80: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3c90: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20  Obj(rwflag));.  
3ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3cd0: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b  ewIntObj(size));
3ce0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
3cf0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3d00: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
3d10: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3d20: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3d30: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
3d40: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
3d50: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
3d60: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3d70: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
3d80: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
3d90: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
3da0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
3db0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
3dc0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d  OK) {.#if (TCL_M
3dd0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20  AJOR_VERSION == 
3de0: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52  8) && (TCL_MINOR
3df0: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54  _VERSION < 6)..T
3e00: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
3e10: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73  or(interp);.#els
3e20: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  e..Tcl_Backgroun
3e30: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
3e40: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
3e50: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
3e60: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
3e70: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
3e80: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
3e90: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3ea0: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73     /* If success
3eb0: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70  ful, pass back p
3ec0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61  assword string a
3ed0: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74  nd truncate if t
3ee0: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69  oo long */.    i
3ef0: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f  f (code == TCL_O
3f00: 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c  K) {..Tcl_Size l
3f10: 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d  en;..char *ret =
3f20: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
3f30: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
3f40: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3f50: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a  interp), &len);.
3f60: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f  .if (len > (Tcl_
3f70: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a  Size) size-1) {.
3f80: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f  .    len = (Tcl_
3f90: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d  Size) size-1;..}
3fa0: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72  ..strncpy(buf, r
3fb0: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  et, (size_t) len
3fc0: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27  );..buf[len] = '
3fd0: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73  \0';..Tcl_Releas
3fe0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3ff0: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28  nterp);..return(
4000: 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20  (int) len);.    
4010: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
4020: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
4030: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
4040: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
40a0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
40b0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
40c0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
40d0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
40e0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
40f0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
4100: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
4110: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
4120: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
4130: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
4140: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
4150: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
4160: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
4170: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
4180: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
4190: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
41a0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
41b0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
41c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
41d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
41e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
41f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4200: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4210: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
4220: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4230: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4240: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
4250: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
4260: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
4270: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
4280: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
4290: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
42a0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
42b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
42c0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
42d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4320: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4330: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20  lback(SSL *ssl, 
4340: 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73  SSL_SESSION *ses
4350: 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74  sion) {.    Stat
4360: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4370: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
4380: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
4390: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
43a0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
43b0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
43c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
43d0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  tr;.    const un
43e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
43f0: 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ket;.    const u
4400: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
4410: 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69  ssion_id;.    si
4420: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75  ze_t len2;.    u
4430: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e  nsigned int ulen
4440: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
4450: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
4460: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
4470: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
4480: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4490: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
44a0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
44b0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
44c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
44d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
44e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
44f0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
4500: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
4510: 63 68 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64  chan, session id
4520: 2c 20 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  , session ticket
4530: 2c 20 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61  , and lifetime a
4540: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
4550: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
4560: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
4570: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
4580: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4590: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
45a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
45b0: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
45c0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
45d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
45e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
45f0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
4600: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
4610: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
4620: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
4630: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  -1));..    /* Se
4640: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
4650: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
4660: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
4670: 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
4680: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4690: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
46a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
46b0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
46c0: 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  j(session_id, (T
46d0: 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b  cl_Size) ulen));
46e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
46f0: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   ticket */.    S
4700: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
4710: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
4720: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
4730: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4740: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4750: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4760: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
4770: 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53  j(ticket, (Tcl_S
4780: 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  ize) len2));..  
4790: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
47a0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
47b0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
47c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
47d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
47e0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
47f0: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
4800: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
4810: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
4820: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
4830: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
4840: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
4850: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4860: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
4870: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
4880: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
4890: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
48a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
48b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
48c0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4910: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63  . * ALPN Callbac
4920: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e  k for Servers an
4930: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66  d NPN Callback f
4940: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4950: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74  . *.Perform prot
4960: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
4970: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65  h2, h3, etc.) se
4980: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  lection for the.
4990: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e   *.incoming conn
49a0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61  ection. Called a
49b0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73  fter Hello and s
49c0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  erver callbacks.
49d0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20  . *.Where 'out' 
49e0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  is selected prot
49f0: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73  ocol and 'in' is
4a00: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74   the peer advert
4a10: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ised list.. *. *
4a20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4a30: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4a40: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4a50: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4a60: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4a70: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4a80: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41  TLSEXT_ERR_OK: A
4a90: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  LPN protocol sel
4aa0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
4ab0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
4ac0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4ad0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
4ae0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65  There was no ove
4af0: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65  rlap between the
4b00: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20   client's. *.   
4b10: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61   supplied list a
4b20: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f  nd the server co
4b30: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65  nfiguration. The
4b40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
4b50: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09   be aborted.. *.
4b60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4b70: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  OACK: ALPN proto
4b80: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
4b90: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20  , e.g., because 
4ba0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70  no ALPN. *.    p
4bb0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e  rotocols are con
4bc0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
4bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
4be0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4bf0: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4c40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41   */.static int.A
4c50: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20  LPNCallback(SSL 
4c60: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69  *ssl, const unsi
4c70: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c  gned char **out,
4c80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c90: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75  outlen,..const u
4ca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e  nsigned char *in
4cb0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69  , unsigned int i
4cc0: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29  nlen, void *arg)
4cd0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
4ce0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
4cf0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
4d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
4d10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
4d20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
4d30: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
4d40: 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70  de, res;..    dp
4d50: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
4d60: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
4d70: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
4d80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4d90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4da0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
4db0: 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f   /* Select proto
4dc0: 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53  col */.    if (S
4dd0: 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70  SL_select_next_p
4de0: 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64 20 63  roto((unsigned c
4df0: 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74  har **) out, out
4e00: 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  len, statePtr->p
4e10: 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d  rotos, statePtr-
4e20: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e  >protos_len,..in
4e30: 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e  , inlen) == OPEN
4e40: 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54  SSL_NPN_NEGOTIAT
4e50: 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20  ED) {../* Match 
4e60: 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20  found */..res = 
4e70: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4e80: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
4e90: 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f  ./* OPENSSL_NPN_
4ea0: 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20  NO_OVERLAP = No 
4eb0: 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20  overlap, so use 
4ec0: 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20  first item from 
4ed0: 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20  client protocol 
4ee0: 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53  list */..res = S
4ef0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4f00: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
4f10: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
4f20: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
4f30: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4f40: 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  res;.    }..    
4f50: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
4f60: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
4f70: 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20  n, chan, depth, 
4f80: 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20  cert info list, 
4f90: 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f  status, and erro
4fa0: 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  r args */.    cm
4fb0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
4fc0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
4fd0: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c  ->vcmd);.    Tcl
4fe0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4ff0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5000: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
5010: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d  ingObj("alpn", -
5020: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5030: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5040: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5050: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
5060: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
5070: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
5080: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
5090: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
50a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
50b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
50c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
50d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a  (const char *) *
50e0: 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  out, -1));.    T
50f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5100: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5110: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
5120: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d  ooleanObj(res ==
5130: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5140: 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  OK));..    /* Ev
5150: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5160: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5170: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5180: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5190: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
51a0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
51b0: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
51c0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
51d0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
51e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
51f0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
5200: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5210: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
5220: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  e {..res = SSL_T
5230: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5240: 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  FATAL;.    }.   
5250: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5260: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5270: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5280: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64  -------. *. * Ad
52d0: 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c  vertise Protocol
52e0: 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e  s Callback for N
52f0: 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67  ext Protocol Neg
5300: 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69  otiation (NPN) i
5310: 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d  n ServerHello --
5320: 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68  . *. *.called wh
5330: 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20  en a TLS server 
5340: 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20  needs a list of 
5350: 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63  supported protoc
5360: 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09  ols for Next. *.
5370: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
5380: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  tion.. *. * Resu
5390: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
53a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
53b0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
53c0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
53d0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70  XT_ERR_OK: NPN p
53e0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
53f0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5400: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
5410: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5420: 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  ACK: NPN protoco
5430: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20  l not selected. 
5440: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5450: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  --. */.#ifdef US
54b0: 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74  E_NPN.static int
54c0: 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .NPNCallback(con
54d0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  st SSL *ssl, con
54e0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
54f0: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64   **out, unsigned
5500: 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f   int *outlen, vo
5510: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
5520: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5530: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20   (State*)arg;.. 
5540: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
5550: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
5560: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
5570: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
5580: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5590: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
55a0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f  ..    /* Set pro
55b0: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20  tocols list */. 
55c0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
55d0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
55e0: 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65   {..*out = state
55f0: 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f  Ptr->protos;..*o
5600: 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72  utlen = statePtr
5610: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  ->protos_len;.  
5620: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74    } else {..*out
5630: 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65   = NULL;..*outle
5640: 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53  n = 0;..return S
5650: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5660: 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ACK;.    }.    r
5670: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5680: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  _ERR_OK;.}.#endi
5690: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  f.../*. *-------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
56e0: 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20   * SNI Callback 
56f0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
5700: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72  *. *.Perform ser
5710: 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73  ver-side SNI hos
5720: 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20  tname selection 
5730: 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20  after receiving 
5740: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  SNI extension. *
5750: 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f  .in Client Hello
5760: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68  . Called after h
5770: 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75  ello callback bu
5780: 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61  t before ALPN ca
5790: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
57a0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
57b0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
57c0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
57d0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
57e0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
57f0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
5800: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20  EXT_ERR_OK: SNI 
5810: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65  hostname is acce
5820: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  pted. The connec
5830: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5840: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5850: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53  R_ALERT_FATAL: S
5860: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
5870: 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  ot accepted. The
5880: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20   connection. *. 
5890: 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44     is aborted. D
58a0: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74  efault for alert
58b0: 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43   is SSL_AD_UNREC
58c0: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a  OGNIZED_NAME.. *
58d0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
58e0: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53  ALERT_WARNING: S
58f0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
5900: 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72  ot accepted, war
5910: 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20  ning alert. *.  
5920: 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70    sent (not supp
5930: 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33  orted in TLSv1.3
5940: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ). The connectio
5950: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
5960: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5970: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  OACK: SNI hostna
5980: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5990: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f  ed and not ackno
59a0: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20  wledged,. *.    
59b0: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20  e.g. if SNI has 
59c0: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  not been configu
59d0: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  red. The connect
59e0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
59f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5a40: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61  ic int.SNICallba
5a50: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
5a60: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
5a70: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
5a80: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
5a90: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
5aa0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
5ab0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
5ac0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
5ad0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
5ae0: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73     int code, res
5af0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
5b00: 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e   *servername = N
5b10: 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ULL;..    dprint
5b20: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5b30: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
5b40: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
5b50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5b60: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5b70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5b80: 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54  Only works for T
5b90: 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69  LS 1.2 and earli
5ba0: 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72  er */.    server
5bb0: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73  name = SSL_get_s
5bc0: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
5bd0: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
5be0: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69  ost_name);.    i
5bf0: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c  f (!servername |
5c00: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20  | servername[0] 
5c10: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75  == '\0') {..retu
5c20: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5c30: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
5c40: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
5c50: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
5c60: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
5c70: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5c80: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  RR_OK;.    }..  
5c90: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
5ca0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
5cb0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73   fn, chan, and s
5cc0: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20  erver name args 
5cd0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
5ce0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5cf0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
5d00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5d10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5d20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
5d30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5d40: 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20  "sni", -1));.   
5d50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5d60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5d70: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
5d80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5d90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
5da0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
5db0: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
5dc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5dd0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5de0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
5df0: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
5e00: 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  me , -1));..    
5e10: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5e20: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5e30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5e40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5e50: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5e60: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5e70: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5e80: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
5e90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5ea0: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a  LERT_WARNING;..*
5eb0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55  alert = SSL_AD_U
5ec0: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
5ed0: 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74  ; /* Not support
5ee0: 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f  ed by TLS 1.3 */
5ef0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
5f00: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
5f10: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5f20: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
5f30: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  e {..res = SSL_T
5f40: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5f50: 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d  FATAL;..*alert =
5f60: 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e   SSL_AD_UNRECOGN
5f70: 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f  IZED_NAME; /* No
5f80: 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54  t supported by T
5f90: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a  LS 1.3 */.    }.
5fa0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5fb0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5fc0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
5fd0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6020: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e   ClientHello Han
6030: 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20  dshake Callback 
6040: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
6050: 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72  *. *.Used by ser
6060: 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74  ver to examine t
6070: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69  he server name i
6080: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20  ndication (SNI) 
6090: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f  extension. *.pro
60a0: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69  vided by the cli
60b0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
60c0: 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70  select an approp
60d0: 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74  riate certificat
60e0: 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c  e to. *.present,
60f0: 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20   and make other 
6100: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64  configuration ad
6110: 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61  justments releva
6120: 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65  nt to that serve
6130: 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74  r. *.name and it
6140: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  s configuration.
6150: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73   This includes s
6160: 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20  wapping out the 
6170: 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53  associated. *.SS
6180: 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d  L_CTX pointer, m
6190: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72  odifying the ser
61a0: 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65  ver's list of pe
61b0: 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73  rmitted TLS vers
61c0: 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e  ions,. *.changin
61d0: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63  g the server's c
61e0: 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65  ipher list in re
61f0: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c  sponse to the cl
6200: 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69  ient's cipher li
6210: 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c  st, etc.. *.Call
6220: 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e  ed before SNI an
6230: 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73  d ALPN callbacks
6240: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6250: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
6260: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6270: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
6280: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
6290: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
62a0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
62b0: 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65  LLO_RETRY: suspe
62c0: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
62d0: 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68  , and the handsh
62e0: 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ake function wil
62f0: 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  l return immedia
6300: 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  tely. *.SSL_CLIE
6310: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20  NT_HELLO_ERROR: 
6320: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61  failure, termina
6330: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53  te connection. S
6340: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f  et alert to erro
6350: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43  r code.. *.SSL_C
6360: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
6370: 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a  ESS: success. *.
6380: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63c0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
63d0: 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61   int.HelloCallba
63e0: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  ck(SSL *ssl, int
63f0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
6400: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
6410: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
6420: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
6430: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
6440: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
6450: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
6460: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
6470: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
6480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76  const char *serv
6490: 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  ername;.    cons
64a0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
64b0: 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  *p;.    size_t l
64c0: 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a  en, remaining;..
64d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
64e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
64f0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
6500: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
6510: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
6520: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6530: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
6540: 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e   if (ssl == (con
6550: 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c  st SSL *)NULL ||
6560: 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29   arg == (void *)
6570: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
6580: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6590: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
65a0: 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20     /* Get names 
65b0: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
65c0: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74  client_hello_get
65d0: 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58  0_ext(ssl, TLSEX
65e0: 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61  T_TYPE_server_na
65f0: 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69  me, &p, &remaini
6600: 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67  ng) || remaining
6610: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74   <= 2) {..*alert
6620: 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41   = SSL_R_SSLV3_A
6630: 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52  LERT_ILLEGAL_PAR
6640: 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20  AMETER;..return 
6650: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6660: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6670: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
6680: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
6690: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66  supplied list of
66a0: 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c   names. */.    l
66b0: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20  en = (*(p++) << 
66c0: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a  8);.    len += *
66d0: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c  (p++);.    if (l
66e0: 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e  en + 2 != remain
66f0: 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  ing) {..*alert =
6700: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45   SSL_R_SSLV3_ALE
6710: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d  RT_ILLEGAL_PARAM
6720: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  ETER;..return SS
6730: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6740: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6750: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b  remaining = len;
6760: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73  ..    /* The lis
6770: 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e  t in practice on
6780: 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20  ly has a single 
6790: 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f  element, so we o
67a0: 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65  nly consider the
67b0: 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20   first one. */. 
67c0: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67     if (remaining
67d0: 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d   == 0 || *p++ !=
67e0: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
67f0: 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a  _host_name) {..*
6800: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6810: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6820: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6830: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6840: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6850: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b      remaining--;
6860: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20  ..    /* Now we 
6870: 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c  can finally pull
6880: 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72   out the byte ar
6890: 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74  ray with the act
68a0: 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f  ual hostname. */
68b0: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69  .    if (remaini
68c0: 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65  ng <= 2) {..*ale
68d0: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
68e0: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
68f0: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6900: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6910: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6920: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c   len = (*(p++) <
6930: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d  < 8);.    len +=
6940: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20   *(p++);.    if 
6950: 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69  (len + 2 > remai
6960: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20  ning) {..*alert 
6970: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6980: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6990: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
69a0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
69b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
69c0: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20  maining = len;. 
69d0: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20     servername = 
69e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b  (const char *)p;
69f0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6a00: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
6a10: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61  with fn, chan, a
6a20: 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61  nd server name a
6a30: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
6a40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
6a50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
6a60: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
6a70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6a80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6a90: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6aa0: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29  Obj("hello", -1)
6ab0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
6ac0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
6ae0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
6af0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
6b00: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
6b10: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
6b20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6b30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6b40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
6b50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
6b60: 72 76 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53  rvername, (Tcl_S
6b70: 69 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20  ize) len));..   
6b80: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
6b90: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
6ba0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
6bb0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
6bc0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
6bd0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
6be0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
6bf0: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
6c00: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6c10: 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74  O_RETRY;..*alert
6c20: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6c30: 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c  LERT_USER_CANCEL
6c40: 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LED;.    } else 
6c50: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
6c60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
6c70: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
6c80: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6c90: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6ca0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a  _HELLO_ERROR;..*
6cb0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6cc0: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6cd0: 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  AL_ERROR;.    }.
6ce0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
6cf0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
6d00: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
6d10: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6d20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d  *******/./* Comm
6d30: 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a  ands         */.
6d40: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6d50: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62  . *. * CiphersOb
6db0: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61  jCmd -- list ava
6dc0: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20  ilable ciphers. 
6dd0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
6de0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
6df0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74  o process the "t
6e00: 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d  ls::ciphers" com
6e10: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20  mand. *.to list 
6e20: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72  available cipher
6e30: 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72  s, based upon pr
6e40: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
6e50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6e60: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
6e70: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
6e80: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6e90: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
6ea0: 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53   and destroys SS
6eb0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
6ec0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
6f10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6f20: 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a  protocols[] = {.
6f30: 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c  ."ssl2", "ssl3",
6f40: 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31   "tls1", "tls1.1
6f50: 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c  ", "tls1.2", "tl
6f60: 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65  s1.3", NULL.};.e
6f70: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20  num protocol {. 
6f80: 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53     TLS_SSL2, TLS
6f90: 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c  _SSL3, TLS_TLS1,
6fa0: 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53   TLS_TLS1_1, TLS
6fb0: 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53  _TLS1_2, TLS_TLS
6fc0: 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b  1_3, TLS_NONE.};
6fd0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70  ..static int.Cip
6fe0: 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  hersObjCmd(Clien
6ff0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
7000: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
7010: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
7020: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
7030: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
7040: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e  _Obj *objPtr = N
7050: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ULL;.    SSL_CTX
7060: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
7070: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c    SSL *ssl = NUL
7080: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  L;.    STACK_OF(
7090: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b  SSL_CIPHER) *sk;
70a0: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62  .    char *cp, b
70b0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
70c0: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
70d0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
70e0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
70f0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
7100: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
7110: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
7120: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7130: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
7140: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
7150: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
7160: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7170: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7180: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
7190: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
71a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
71b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
71c0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
71d0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
71e0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
71f0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
7200: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
7210: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7230: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7240: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
7250: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7260: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7270: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7280: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7290: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
72a0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
72b0: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
72c0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
72d0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
72e0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
72f0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7300: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7310: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
7320: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
7330: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
7340: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
7350: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7360: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7370: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7380: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
7390: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
73a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
73b0: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
73c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
73d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
73e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
73f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7400: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7410: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7420: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7430: 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68  hod = SSLv2_meth
7440: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7450: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  dif..case TLS_SS
7460: 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  L3:.#if defined(
7470: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
7480: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
7490: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
74a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f  OPENSSL_NO_SSL3_
74b0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
74c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
74d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
74e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
74f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7500: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7520: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7530: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68  hod = SSLv3_meth
7540: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7550: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
7560: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
7570: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
7580: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7590: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
75a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
75b0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
75c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
75d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
75e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
75f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7600: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7620: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7630: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68  hod = TLSv1_meth
7640: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7650: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
7660: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_1:.#if define
7670: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
7680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7690: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
76a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
76b0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
76c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
76d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
76e0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
76f0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7700: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7710: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7720: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7730: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7740: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20  Sv1_1_method(); 
7750: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7760: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a  ase TLS_TLS1_2:.
7770: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7780: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
7790: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
77a0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
77b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
77c0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  2_METHOD)..    T
77d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
77e0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
77f0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7800: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7810: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
7820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7830: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7840: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f  ethod = TLSv1_2_
7850: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7860: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7870: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65  S_TLS1_3:.#if de
7880: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
7890: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
78a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
78b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
78c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
78d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
78e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
78f0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
7900: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7910: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7920: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53      method = TLS
7930: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20  _method();..    
7940: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
7950: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
7960: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
7970: 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  N);..    SSL_CTX
7980: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
7990: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
79a0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20  _3_VERSION);..  
79b0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
79c0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d  .default:..    m
79d0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
79e0: 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  od();..    break
79f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78  ;.    }..    ctx
7a00: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
7a10: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
7a20: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx == NULL) {..
7a30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7a40: 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52  (interp, GET_ERR
7a50: 5f 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29  _REASON(), NULL)
7a60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7a70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7a80: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74  ssl = SSL_new(ct
7a90: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  x);.    if (ssl 
7aa0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7ab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7ac0: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7ad0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53  SON(), NULL);..S
7ae0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
7af0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7b00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7b10: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20  /* Use list and 
7b20: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62  order as would b
7b30: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65  e sent in a Clie
7b40: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61  ntHello or all a
7b50: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
7b60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f   */.    if (use_
7b70: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b  supported) {..sk
7b80: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70   = SSL_get1_supp
7b90: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73  orted_ciphers(ss
7ba0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
7bb0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63  ..sk = SSL_get_c
7bc0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
7bd0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21   }..    if (sk !
7be0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21  = NULL) {..if (!
7bf0: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20  verbose) {..    
7c00: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7c10: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7c20: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
7c30: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
7c40: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
7c50: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
7c60: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
7c70: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
7c80: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
7c90: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
7ca0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
7cb0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
7cc0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
7cd0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
7ce0: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
7cf0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
7d00: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
7d10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7d20: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7d30: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
7d40: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20  1));..    }...} 
7d50: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50  else {..    objP
7d60: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
7d70: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20  ngObj("",0);..  
7d80: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
7d90: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50  ; i < sk_SSL_CIP
7da0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b  HER_num(sk); i++
7db0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f  ) {...const SSL_
7dc0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53  CIPHER *c = sk_S
7dd0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
7de0: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20  sk, i);...if (c 
7df0: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75  == NULL) continu
7e00: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c  e;..../* textual
7e10: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
7e20: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09  the cipher */...
7e30: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
7e40: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75  escription(c, bu
7e50: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
7e60: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  != NULL) {...   
7e70: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
7e80: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54  (objPtr, buf, (T
7e90: 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28  cl_Size) strlen(
7ea0: 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  buf));...} else 
7eb0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
7ec0: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20  ndToObj(objPtr, 
7ed0: 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b  "UNKNOWN\n", 8);
7ee0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ...}..    }..}..
7ef0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7f00: 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c  d) {..    sk_SSL
7f10: 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29  _CIPHER_free(sk)
7f20: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53  ;..}.    }.    S
7f30: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20  SL_free(ssl);.  
7f40: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
7f50: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  tx);..    Tcl_Se
7f60: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7f70: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
7f80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7f90: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
7fe0: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  * ProtocolsObjCm
7ff0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
8000: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a  ble protocols. *
8010: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
8020: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
8030: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c   process the "tl
8040: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f  s::protocols" co
8050: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
8060: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f   available proto
8070: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cols.. *. * Resu
8080: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
8090: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
80a0: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
80b0: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
80c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8110: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c  tic int.Protocol
8120: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
8130: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
8140: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8150: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8160: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
8170: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
8180: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28  j *objPtr;.    (
8190: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
81a0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
81b0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
81c0: 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a  f (objc != 1) {.
81d0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
81e0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
81f0: 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20  v, "");..return 
8200: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8210: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8220: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62  error();..    ob
8230: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
8240: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
8250: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
8260: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
8270: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
8280: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
8290: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
82a0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
82b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
82c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
82d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
82e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
82f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d  ols[TLS_SSL2], -
8300: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8310: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
8320: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8330: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
8340: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8350: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
8360: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8370: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8380: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8390: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
83a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
83b0: 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL3], -1));.#end
83c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
83d0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
83e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
83f0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
8400: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8410: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  1_METHOD).    Tc
8420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8440: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8450: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8460: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29  s[TLS_TLS1], -1)
8470: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8480: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
8490: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
84a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
84b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
84c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
84d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
84e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
84f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8500: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8510: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8520: 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29  LS_TLS1_1], -1))
8530: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8540: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
8550: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8560: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
8570: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8580: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
8590: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
85a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
85b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
85c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
85d0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
85e0: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b  S_TLS1_2], -1));
85f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8600: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
8610: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8620: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
8630: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8640: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8650: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8660: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8670: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
8680: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
8690: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
86a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
86b0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
86c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
86d0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61  -------. *. * Ha
8720: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d  ndshakeObjCmd --
8730: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d  . *. *.This comm
8740: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76  and is used to v
8750: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68  erify whether th
8760: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63  e handshake is c
8770: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f  omplete. *.or no
8780: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
8790: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
87a0: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65  Tcl result. 1 me
87b0: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f  ans handshake co
87c0: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20  mplete, 0 means 
87d0: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  pending.. *. * S
87e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
87f0: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65  May force SSL ne
8800: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b  gotiation to tak
8810: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d  e place.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
8870: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
8880: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
8890: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
88a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
88b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
88c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
88d0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
88e0: 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  han;        /* T
88f0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
8900: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
8910: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
8920: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63  Ptr;        /* c
8930: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
8940: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
8950: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72    const char *er
8960: 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  rStr = NULL;.   
8970: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20   int ret = 1;.  
8980: 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20    int err = 0;. 
8990: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
89a0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
89b0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
89c0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
89d0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
89e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
89f0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
8a00: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
8a10: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
8a20: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
8a30: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
8a40: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
8a50: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8a60: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
8a70: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
8a80: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
8a90: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
8aa0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
8ab0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
8ac0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
8ad0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
8ae0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
8af0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
8b00: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
8b10: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
8b20: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
8b30: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
8b40: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
8b50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8b60: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
8b70: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
8b80: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
8b90: 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61  ..    "\": not a
8ba0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
8bb0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
8bc0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
8bd0: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b  "TLS", "HANDSHAK
8be0: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  E", "CHANNEL", "
8bf0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
8c00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
8c10: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
8c20: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
8c30: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f   = (State *)Tcl_
8c40: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
8c50: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
8c60: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
8c70: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
8c80: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65  onnect");.    re
8c90: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  t = Tls_WaitForC
8ca0: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c  onnect(statePtr,
8cb0: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64   &err, 1);.    d
8cc0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74  printf("Tls_Wait
8cd0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72  ForConnect retur
8ce0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a  ned: %i", ret);.
8cf0: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30  .    if (ret < 0
8d00: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e   && ((statePtr->
8d10: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
8d20: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d  ASYNC) && (err =
8d30: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64  = EAGAIN))) {..d
8d40: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65  printf("Async se
8d50: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41  t and err = EAGA
8d60: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a  IN");..ret = 0;.
8d70: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72      } else if (r
8d80: 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20  et < 0) {..long 
8d90: 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20  result;..errStr 
8da0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b  = statePtr->err;
8db0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c  ..Tcl_ResetResul
8dc0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f  t(interp);..Tcl_
8dd0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a  SetErrno(err);..
8de0: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20  .if (!errStr || 
8df0: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20  (*errStr == 0)) 
8e00: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20  {..    errStr = 
8e10: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
8e20: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c  nterp);..}...Tcl
8e30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8e40: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65  terp, "handshake
8e50: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53   failed: ", errS
8e60: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  tr, (char *) NUL
8e70: 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74  L);..if ((result
8e80: 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66   = SSL_get_verif
8e90: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
8ea0: 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39  r->ssl)) != X509
8eb0: 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63  _V_OK) {..    Tc
8ec0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8ed0: 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20  nterp, " due to 
8ee0: 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79  \"", X509_verify
8ef0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
8f00: 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22  ng(result), "\""
8f10: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
8f20: 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72  ;..}..Tcl_SetErr
8f30: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
8f40: 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45  TLS", "HANDSHAKE
8f50: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
8f60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70  ar *) NULL);..dp
8f70: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
8f80: 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20   TCL_ERROR with 
8f90: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
8fa0: 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a  : %s", errStr);.
8fb0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
8fc0: 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  R);.    } else {
8fd0: 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20  ..if (err != 0) 
8fe0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
8ff0: 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74  Got an error wit
9000: 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61  h a completed ha
9010: 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25  ndshake: err = %
9020: 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65  i", err);..}..re
9030: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
9040: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
9050: 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68  ning TCL_OK with
9060: 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72   data \"%i\"", r
9070: 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  et);.    Tcl_Set
9080: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9090: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
90a0: 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ret));.    retur
90b0: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(TCL_OK);.}../*
90c0: 0a 20 2a 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 49 6d 70  ------. *. * Imp
9110: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
9120: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
9130: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
9140: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c  process the "ssl
9150: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09  " command. *. *.
9160: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20  The ssl command 
9170: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20  pushes SSL over 
9180: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74  a (newly connect
9190: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20  ed) tcp socket. 
91a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
91b0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
91c0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
91d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
91e0: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
91f0: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
9200: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
9260: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  .ImportObjCmd(Cl
9270: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
9280: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
9290: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
92a0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
92b0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
92c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
92d0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
92e0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
92f0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
9300: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
9310: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
9320: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
9330: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09     SSL_CTX *ctx.
9340: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9350: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20  _Obj *script..= 
9360: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9370: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e  j *password..= N
9380: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9390: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a   *vcmd..= NULL;.
93a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
93b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
93c0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
93d0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
93e0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
93f0: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
9400: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
9410: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53  t idx;.    Tcl_S
9420: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  ize len;.    int
9430: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54   flags...= TLS_T
9440: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
9450: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f   server...= 0;./
9460: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
9470: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
9480: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
9490: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55  r *keyfile..= NU
94a0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
94b0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  rtfile..= NULL;.
94c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
94d0: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a  r *key..= NULL;.
94e0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
94f0: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75  _len..= 0;.    u
9500: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
9510: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rt..= NULL;.    
9520: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
9530: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  n..= 0;.    char
9540: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c   *ciphers..= NUL
9550: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
9560: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c  hersuites..= NUL
9570: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
9580: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
9590: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d   char *CApath..=
95a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
95b0: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c  *DHparams..= NUL
95c0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64  L;.    char *mod
95d0: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  el...= NULL;.   
95e0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
95f0: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f  e..= NULL;./* ho
9600: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65  stname for Serve
9610: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f  r Name Indicatio
9620: 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  n */.    const u
9630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
9640: 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b  ssion_id = NULL;
9650: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c  .    Tcl_Obj *al
9660: 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  pn..= NULL;.    
9670: 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73  int ssl2 = 0, ss
9680: 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  l3 = 0;.    int 
9690: 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31  tls1 = 1, tls1_1
96a0: 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31   = 1, tls1_2 = 1
96b0: 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20  , tls1_3 = 1;.  
96c0: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c    int proto = 0,
96d0: 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20   level = -1;.   
96e0: 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c   int verify = 0,
96f0: 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65   require = 0, re
9700: 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f  quest = 1, post_
9710: 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20  handshake = 0;. 
9720: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
9730: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
9740: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23  tf("Called");..#
9750: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9760: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
9770: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
9780: 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65      tls1 = 0;.#e
9790: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
97a0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
97b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
97c0: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c  O_TLS1_1).    tl
97d0: 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_1 = 0;.#endif
97e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
97f0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
9800: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9810: 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32  S1_2).    tls1_2
9820: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
9830: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9840: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
9850: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
9860: 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30  ).    tls1_3 = 0
9870: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
9880: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
9890: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
98a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
98b0: 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f   "channel ?optio
98c0: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ns?");..return T
98d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
98e0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
98f0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61  rror();..    cha
9900: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
9910: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
9920: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
9930: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
9940: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
9950: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
9960: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
9970: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
9980: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
9990: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
99a0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
99b0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
99c0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
99d0: 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64  n);..    for (id
99e0: 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a  x = 2; idx < obj
99f0: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61  c; idx++) {..cha
9a00: 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74  r *opt = Tcl_Get
9a10: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d  String(objv[idx]
9a20: 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20  );...if (opt[0] 
9a30: 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65  != '-')..    bre
9a40: 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61  ak;...OPTOBJ("-a
9a50: 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50  lpn", alpn);..OP
9a60: 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43  TSTR("-cadir", C
9a70: 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 28  Apath);..OPTSTR(
9a80: 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c  "-cafile", CAfil
9a90: 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63  e);..OPTBYTE("-c
9aa0: 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74  ert", cert, cert
9ab0: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  _len);..OPTSTR("
9ac0: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74  -certfile", cert
9ad0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
9ae0: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72  -cipher", cipher
9af0: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  s);..OPTSTR("-ci
9b00: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29  phers", ciphers)
9b10: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9b20: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65  ersuites", ciphe
9b30: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42  rsuites);..OPTOB
9b40: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63  J("-command", sc
9b50: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22  ript);..OPTSTR("
9b60: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61  -dhparams", DHpa
9b70: 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28  rams);..OPTBYTE(
9b80: 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79  "-key", key, key
9b90: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  _len);..OPTSTR("
9ba0: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69  -keyfile", keyfi
9bb0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d  le);..OPTSTR("-m
9bc0: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09  odel", model);..
9bd0: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72  OPTOBJ("-passwor
9be0: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09  d", password);..
9bf0: 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68  OPTBOOL("-post_h
9c00: 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f  andshake", post_
9c10: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54  handshake);..OPT
9c20: 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c  BOOL("-request",
9c30: 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42   request);..OPTB
9c40: 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20  OOL("-require", 
9c50: 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e  require);..OPTIN
9c60: 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76  T("-security_lev
9c70: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50  el", level);..OP
9c80: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c  TBOOL("-server",
9c90: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54   server);..OPTST
9ca0: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c  R("-servername",
9cb0: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f   servername);..O
9cc0: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f  PTSTR("-session_
9cd0: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29  id", session_id)
9ce0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
9cf0: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42  2", ssl2);..OPTB
9d00: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c  OOL("-ssl3", ssl
9d10: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  3);..OPTBOOL("-t
9d20: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50  ls1", tls1);..OP
9d30: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c  TBOOL("-tls1.1",
9d40: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f   tls1_1);..OPTBO
9d50: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c  OL("-tls1.2", tl
9d60: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_2);..OPTBOOL(
9d70: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f  "-tls1.3", tls1_
9d80: 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61  3);..OPTOBJ("-va
9d90: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20  lidatecommand", 
9da0: 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  vcmd);..OPTOBJ("
9db0: 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a  -vcmd", vcmd);..
9dc0: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22  .OPTBAD("option"
9dd0: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72  , "-alpn, -cadir
9de0: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74  , -cafile, -cert
9df0: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
9e00: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69  pher, -ciphersui
9e10: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  tes, -command, -
9e20: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
9e30: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
9e40: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f  , -password, -po
9e50: 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72  st_handshake, -r
9e60: 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65  equest, -require
9e70: 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65  , -security_leve
9e80: 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72  l, -server, -ser
9e90: 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f  vername, -sessio
9ea0: 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73  n_id, -ssl2, -ss
9eb0: 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31  l3, -tls1, -tls1
9ec0: 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c  .1, -tls1.2, -tl
9ed0: 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61  s1.3, or -valida
9ee0: 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72  tecommand");...r
9ef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9f00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72  .    }.    if (r
9f10: 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20  equest)..verify 
9f20: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c  |= SSL_VERIFY_CL
9f30: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f  IENT_ONCE | SSL_
9f40: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20  VERIFY_PEER;.   
9f50: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20   if (request && 
9f60: 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20  require).verify 
9f70: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41  |= SSL_VERIFY_FA
9f80: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
9f90: 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  RT;.    if (requ
9fa0: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64  est && post_hand
9fb0: 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d  shake).verify |=
9fc0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
9fd0: 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20  _HANDSHAKE;.    
9fe0: 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29  if (verify == 0)
9ff0: 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56  ..verify = SSL_V
a000: 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20  ERIFY_NONE;..   
a010: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20   proto |= (ssl2 
a020: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  ? TLS_PROTO_SSL2
a030: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a040: 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f   |= (ssl3 ? TLS_
a050: 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b  PROTO_SSL3 : 0);
a060: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
a070: 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  ls1 ? TLS_PROTO_
a080: 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  TLS1 : 0);.    p
a090: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20  roto |= (tls1_1 
a0a0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
a0b0: 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _1 : 0);.    pro
a0c0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20  to |= (tls1_2 ? 
a0d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
a0e0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a0f0: 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c   |= (tls1_3 ? TL
a100: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a  S_PROTO_TLS1_3 :
a110: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73   0);..    /* res
a120: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c  et to NULL if bl
a130: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69  ank string provi
a140: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ded */.    if (c
a150: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09  ert && !*cert)..
a160: 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20          cert.   
a170: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a180: 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65   if (key && !*ke
a190: 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09  y)..        key.
a1a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a1b0: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
a1c0: 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20   && !*certfile) 
a1d0: 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65          certfile
a1e0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20  .= NULL;.    if 
a1f0: 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65  (keyfile && !*ke
a200: 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09  yfile)..keyfile.
a210: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a220: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20      if (ciphers 
a230: 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20  && !*ciphers).  
a240: 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20        ciphers.  
a250: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a260: 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74    if (ciphersuit
a270: 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75  es && !*ciphersu
a280: 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74  ites) ciphersuit
a290: 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20  es    = NULL;.  
a2a0: 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20    if (CAfile && 
a2b0: 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20  !*CAfile).      
a2c0: 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20    CAfile.       
a2d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a2e0: 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70  (CApath && !*CAp
a2f0: 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70  ath).        CAp
a300: 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ath.        = NU
a310: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61  LL;.    if (DHpa
a320: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61  rams && !*DHpara
a330: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61  ms).        DHpa
a340: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55  rams        = NU
a350: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20  LL;..    /* new 
a360: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  SSL state */.   
a370: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74   statePtr..= (St
a380: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28  ate *) ckalloc((
a390: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66  unsigned) sizeof
a3a0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65  (State));.    me
a3b0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30  mset(statePtr, 0
a3c0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  , sizeof(State))
a3d0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
a3e0: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a  >flags.= flags;.
a3f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e      statePtr->in
a400: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20  terp.= interp;. 
a410: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c     statePtr->vfl
a420: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20  ags.= verify;.  
a430: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09    statePtr->err.
a440: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c  = "";..    /* al
a450: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f  locate script */
a460: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29  .    if (script)
a470: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
a480: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a490: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09  script, &len);..
a4a0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a4b0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a4c0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20  ck = script;..  
a4d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a4e0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
a4f0: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  lback);..}.    }
a500: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a510: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
a520: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20    if (password) 
a530: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a540: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
a550: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a  assword, &len);.
a560: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a570: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
a580: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a  ord = password;.
a590: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a5a0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a5b0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
a5c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a5d0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f  cate validate co
a5e0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20  mmand */.    if 
a5f0: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29  (vcmd) {..(void)
a600: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a610: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e  omObj(vcmd, &len
a620: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a630: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63      statePtr->vc
a640: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20  md = vcmd;..    
a650: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a660: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
a670: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a680: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
a690: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
a6a0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
a6b0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
a6c0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
a6d0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
a6e0: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
a6f0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
a700: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
a710: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a720: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a730: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a740: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
a750: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  .. * Make sure t
a760: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
a770: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
a780: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  .. */..chan = Tc
a790: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
a7a0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f  chan);..if (Tcl_
a7b0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
a7c0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
a7d0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20  nelType()) {..  
a7e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a7f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
a800: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
a810: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
a820: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
a830: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
a840: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  , NULL);..    Tc
a850: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a860: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a870: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c  MPORT", "CHANNEL
a880: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
a890: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a8a0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
a8b0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
a8c0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a8d0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
a8e0: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
a8f0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
a900: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
a910: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
a920: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
a930: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
a940: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
a950: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
a960: 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 69 6e 74   key, cert, (int
a970: 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20  ) key_len,..    
a980: 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20  (int) cert_len, 
a990: 43 41 70 61 74 68 2c 20 43 41 66 69 6c 65 2c 20  CApath, CAfile, 
a9a0: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73  ciphers, ciphers
a9b0: 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48  uites, level, DH
a9c0: 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c  params)) == NULL
a9d0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
a9e0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a9f0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
aa00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
aa10: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
aa20: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
aa30: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
aa40: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
aa50: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
aa60: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
aa70: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
aa80: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
aa90: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
aaa0: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65  d up)..     * We
aab0: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64   only want to ad
aac0: 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69  just the bufferi
aad0: 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61  ng in pre-v2 cha
aae0: 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20  nnels, where.   
aaf0: 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c    * each channel
ab00: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61   in the stack ma
ab10: 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e  intained its own
ab20: 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a   buffers..     *
ab30: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
ab40: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
ab50: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
ab60: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ab70: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
ab80: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
ab90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
aba0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
abb0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
abc0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
abd0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
abe0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
abf0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ac00: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
ac10: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
ac20: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
ac30: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
ac40: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
ac50: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  han, "-encoding"
ac60: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
ac70: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
ac80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
ac90: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
aca0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
acb0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72   &upperChannelTr
acc0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
acd0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
ace0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
acf0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
ad00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
ad10: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
ad20: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
ad30: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
ad40: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
ad50: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63  binary");.    Tc
ad60: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ad70: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
ad80: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74   "-blocking", "t
ad90: 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e  rue");.    dprin
ada0: 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63  tf("Consuming Tc
adb0: 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54  l channel %s", T
adc0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
add0: 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74  e(chan));.    st
ade0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
adf0: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
ae00: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e  interp, Tls_Chan
ae10: 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65  nelType(), (Clie
ae20: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
ae30: 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45  ,..(TCL_READABLE
ae40: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   | TCL_WRITABLE)
ae50: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72  , chan);.    dpr
ae60: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68  intf("Created ch
ae70: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c  annel named %s",
ae80: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ae90: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
aea0: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74  lf));.    if (st
aeb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
aec0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
aed0: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f  LL) {../*.. * No
aee0: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e   use of Tcl_Even
aef0: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75  tuallyFree becau
af00: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54  se no possible T
af10: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a  cl_Preserve... *
af20: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  /..Tls_Free((cha
af30: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
af40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
af50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
af60: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
af70: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
af80: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61  Ptr->self, "-tra
af90: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44  nslation", Tcl_D
afa0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
afb0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
afc0: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f  tion));.    Tcl_
afd0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
afe0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
aff0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64  r->self, "-encod
b000: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
b010: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
b020: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a  nnelEncoding));.
b030: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b040: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b050: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b060: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c   "-eofchar", Tcl
b070: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
b080: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
b090: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ar));.    Tcl_Se
b0a0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b0b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b0c0: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e  >self, "-blockin
b0d0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
b0e0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
b0f0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20  elBlocking));.  
b100: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b110: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
b120: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
b130: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
b140: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
b150: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
b160: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b170: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
b180: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
b190: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b1a0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
b1b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
b1c0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
b1d0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
b1e0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
b1f0: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
b200: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
b210: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
b220: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
b230: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
b240: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b250: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
b260: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
b270: 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  on: ", GET_ERR_R
b280: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
b290: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
b2a0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b2b0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b2c0: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
b2d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b2e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
b2f0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b300: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
b310: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b320: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
b330: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
b340: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
b350: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
b360: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
b370: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
b380: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
b390: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
b3a0: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
b3b0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
b3c0: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
b3d0: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33  g, though RFC 43
b3e0: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a  66 says UTF-8. *
b3f0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f  /..if (!SSL_set_
b400: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65  tlsext_host_name
b410: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b420: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72  servername) && r
b430: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54  equire) {..    T
b440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b450: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49  interp, "Set SNI
b460: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65   extension faile
b470: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b480: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b490: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b4a0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b4b0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b4c0: 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46  PORT", "SNI", "F
b4d0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b4e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
b4f0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
b500: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b520: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73  ..}.../* Set hos
b530: 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63  tname for peer c
b540: 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e  ertificate hostn
b550: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
b560: 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20   in clients...  
b570: 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73   Don't use SSL_s
b580: 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69  et1_host since i
b590: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
b5a0: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
b5b0: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
b5c0: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b5d0: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
b5e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b5f0: 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68  terp, "Set DNS h
b600: 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20  ostname failed: 
b610: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b620: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b630: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b640: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b650: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b660: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20  T", "HOSTNAME", 
b670: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b680: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b690: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b6a0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b6b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b6c0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
b6d0: 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69   /* Resume sessi
b6e0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20  on id */.    if 
b6f0: 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73  (session_id && s
b700: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64  trlen(session_id
b710: 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44  ) <= SSL_MAX_SID
b720: 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09  _CTX_LENGTH) {..
b730: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69  /* SSL_set_sessi
b740: 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53  on() */..if (!SS
b750: 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69  L_SESSION_set1_i
b760: 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65  d_context(SSL_ge
b770: 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50  t_session(stateP
b780: 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f  tr->ssl), sessio
b790: 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20  n_id, (unsigned 
b7a0: 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73  int) strlen(sess
b7b0: 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20  ion_id))) {..   
b7c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b7d0: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d  t(interp, "Resum
b7e0: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64  e session failed
b7f0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b800: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b810: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b820: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b830: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b840: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c  ORT", "SESSION",
b850: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b860: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b870: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b880: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b890: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b8a0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b8b0: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c    /* Enable Appl
b8c0: 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72  ication-Layer Pr
b8d0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
b8e0: 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65  on. Examples are
b8f0: 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74  : http/1.0,..htt
b900: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66  p/1.1, h2, h3, f
b910: 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20  tp, imap, pop3, 
b920: 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70  xmpp-client, xmp
b930: 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20  p-server, mqtt, 
b940: 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20  irc, etc. */.   
b950: 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a   if (alpn) {../*
b960: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c   Convert a TCL l
b970: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f  ist into a proto
b980: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65  col-list in wire
b990: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69  -format */..unsi
b9a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
b9b0: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64  s, *p;..unsigned
b9c0: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20   int protos_len 
b9d0: 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63  = 0;..Tcl_Size c
b9e0: 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09  nt, i;..int j;..
b9f0: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a  Tcl_Obj **list;.
ba00: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62  ..if (Tcl_ListOb
ba10: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
ba20: 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c  erp, alpn, &cnt,
ba30: 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f   &list) != TCL_O
ba40: 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  K) {..    Tls_Fr
ba50: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
ba60: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
ba70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
ba80: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
ba90: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
baa0: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74  red for the prot
bab0: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f  ocol-list */..fo
bac0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e  r (i = 0; i < cn
bad0: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54  t; i++) {..    T
bae0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
baf0: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65  Obj(list[i], &le
bb00: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
bb10: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f   > 255) {...Tcl_
bb20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bb30: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f  erp, "ALPN proto
bb40: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f  col names too lo
bb50: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ng", (char *) NU
bb60: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
bb70: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
bb80: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
bb90: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
bba0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
bbb0: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63  );...Tls_Free((c
bbc0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
bbd0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
bbe0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
bbf0: 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20    protos_len += 
bc00: 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09  1 + (int) len;..
bc10: 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65  }.../* Build the
bc20: 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63   complete protoc
bc30: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74  ol-list */..prot
bc40: 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f  os = ckalloc(pro
bc50: 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72  tos_len);../* pr
bc60: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e  otocol-lists con
bc70: 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65  sist of 8-bit le
bc80: 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62  ngth-prefixed, b
bc90: 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09  yte strings */..
bca0: 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20  for (j = 0, p = 
bcb0: 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b  protos; j < cnt;
bcc0: 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61   j++) {..    cha
bcd0: 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74  r *str = Tcl_Get
bce0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
bcf0: 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[j], &len);.. 
bd00: 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67     *p++ = (unsig
bd10: 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09  ned char) len;..
bd20: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74      memcpy(p, st
bd30: 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  r, (size_t) len)
bd40: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b  ;..    p += len;
bd50: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  ..}.../* SSL_set
bd60: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b  _alpn_protos mak
bd70: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  es a copy of the
bd80: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
bd90: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73  /../* Note: This
bda0: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72   functions rever
bdb0: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76  ses the return v
bdc0: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  alue convention 
bdd0: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f  */..if (SSL_set_
bde0: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74  alpn_protos(stat
bdf0: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f  ePtr->ssl, proto
be00: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20  s, protos_len)) 
be10: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
be20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
be30: 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63  "Set ALPN protoc
be40: 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ols failed: ", G
be50: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
be60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
be70: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
be80: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
be90: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
bea0: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22  "ALPN", "FAILED"
beb0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bec0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
bed0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
bee0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28  r);..    ckfree(
bef0: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65  protos);..    re
bf00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bf10: 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72  .}.../* Store pr
bf20: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a  otocols list */.
bf30: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
bf40: 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61  s = protos;..sta
bf50: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
bf60: 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a  n = protos_len;.
bf70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74      } else {..st
bf80: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
bf90: 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72   NULL;..statePtr
bfa0: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  ->protos_len = 0
bfb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
bfc0: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62       * SSL Callb
bfd0: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20  acks.     */.   
bfe0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74   SSL_set_app_dat
bff0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  a(statePtr->ssl,
c000: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c010: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63  r);./* point bac
c020: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53  k to us */.    S
c030: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74  SL_set_verify(st
c040: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72  atePtr->ssl, ver
c050: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62  ify, VerifyCallb
c060: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65  ack);.    SSL_se
c070: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28  t_info_callback(
c080: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49  statePtr->ssl, I
c090: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  nfoCallback);.. 
c0a0: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
c0b0: 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f  or observing pro
c0c0: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a  tocol messages *
c0d0: 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  /.#ifndef OPENSS
c0e0: 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20  L_NO_SSL_TRACE. 
c0f0: 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43     /* void SSL_C
c100: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  TX_set_msg_callb
c110: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
c120: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73  ->ctx, (void *)s
c130: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f  tatePtr);.    vo
c140: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  id SSL_CTX_set_m
c150: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  sg_callback(stat
c160: 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61  ePtr->ctx, Messa
c170: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a  geCallback); */.
c180: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
c190: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
c1a0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69  tePtr->ssl, (voi
c1b0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
c1c0: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63     SSL_set_msg_c
c1d0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
c1e0: 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61  ->ssl, MessageCa
c1f0: 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  llback);.#endif.
c200: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54  .    /* Create T
c210: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48  cl_Channel BIO H
c220: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74  andler */.    st
c230: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20  atePtr->p_bio.= 
c240: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74  BIO_new_tcl(stat
c250: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  ePtr, BIO_NOCLOS
c260: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  E);.    statePtr
c270: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28  ->bio.= BIO_new(
c280: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20  BIO_f_ssl());.. 
c290: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b     if (server) {
c2a0: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c  ../* Server call
c2b0: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54  backs */..SSL_CT
c2c0: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
c2d0: 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74  vername_arg(stat
c2e0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64  ePtr->ctx, (void
c2f0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53   *)statePtr);..S
c300: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c310: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c  t_servername_cal
c320: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c330: 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b  ctx, SNICallback
c340: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c350: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28  client_hello_cb(
c360: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48  statePtr->ctx, H
c370: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  elloCallback, (v
c380: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c390: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c3a0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
c3b0: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
c3c0: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63  et_alpn_select_c
c3d0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c3e0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28   ALPNCallback, (
c3f0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c400: 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  ;.#ifdef USE_NPN
c410: 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32  ..    if (tls1_2
c420: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
c430: 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54  == 0) {...SSL_CT
c440: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  X_set_next_proto
c450: 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28  s_advertised_cb(
c460: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e  statePtr->ctx, N
c470: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c480: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c490: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a      }.#endif..}.
c4a0: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76  ../* Enable serv
c4b0: 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20  er to send cert 
c4c0: 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61  request after ha
c4d0: 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33  ndshake (TLS 1.3
c4e0: 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20   only) */../* A 
c4f0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
c500: 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20  must take place 
c510: 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63  for the Certific
c520: 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62  ate Request to b
c530: 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68  e..   sent to th
c540: 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63  e client, this c
c550: 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20  an be done with 
c560: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65  SSL_do_handshake
c570: 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75  (). */..if (requ
c580: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64  est && post_hand
c590: 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29  shake && tls1_3)
c5a0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69   {..    SSL_veri
c5b0: 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68  fy_client_post_h
c5c0: 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74  andshake(statePt
c5d0: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a  r->ssl);..}.../*
c5e0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63   set automatic c
c5f0: 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a  urve selection *
c600: 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f  /..SSL_set_ecdh_
c610: 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73  auto(statePtr->s
c620: 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74  sl, 1);.../* Set
c630: 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a   server mode */.
c640: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
c650: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56   |= TLS_TCL_SERV
c660: 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63  ER;..SSL_set_acc
c670: 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50  ept_state(stateP
c680: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
c690: 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e  else {../* Clien
c6a0: 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23  t callbacks */.#
c6b0: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69  ifdef USE_NPN..i
c6c0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c6d0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74  tos != NULL && t
c6e0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c6f0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20  s1_3 == 0) {..  
c700: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65    SSL_CTX_set_ne
c710: 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f  xt_proto_select_
c720: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c730: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
c740: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c750: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f  );..}.#endif.../
c760: 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e  * Session cachin
c770: 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  g */..SSL_CTX_se
c780: 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f  t_session_cache_
c790: 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63  mode(statePtr->c
c7a0: 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  tx, SSL_SESS_CAC
c7b0: 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f  HE_CLIENT | SSL_
c7c0: 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e  SESS_CACHE_NO_IN
c7d0: 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09  TERNAL_STORE);..
c7e0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
c7f0: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72  _new_cb(statePtr
c800: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61  ->ctx, SessionCa
c810: 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e  llback);.../* En
c820: 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68  able post handsh
c830: 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69  ake Authenticati
c840: 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c  on extension. TL
c850: 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20  S 1.3 only, not 
c860: 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28  http/2. */..if (
c870: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
c880: 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20  handshake) {..  
c890: 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68    SSL_set_post_h
c8a0: 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74  andshake_auth(st
c8b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c8c0: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69  ..}.../* Set cli
c8d0: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c  ent mode */..SSL
c8e0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61  _set_connect_sta
c8f0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c900: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  );.    }.    SSL
c910: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
c920: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
c930: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
c940: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
c950: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
c960: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
c970: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
c980: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  LOSE);..    /*. 
c990: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c      * End of SSL
c9a0: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20   Init.     */.  
c9b0: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
c9c0: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65  ning %s", Tcl_Ge
c9d0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
c9e0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
c9f0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
ca00: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
ca10: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
ca20: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
ca30: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  elf), TCL_VOLATI
ca40: 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  LE);..    return
ca50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
ca60: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d  -----. *. * Unim
cab0: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
cac0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
cad0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
cae0: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d   remove the topm
caf0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74  ost channel filt
cb00: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
cb10: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
cb20: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
cb30: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
cb40: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74  . *.May modify t
cb50: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61  he behavior of a
cb60: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  n IO channel.. *
cb70: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
cbc0: 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62  c int.UnimportOb
cbd0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
cbe0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
cbf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cc00: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
cc10: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
cc20: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
cc30: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
cc40: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
cc50: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
cc60: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
cc70: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ata;..    dprint
cc80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
cc90: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
cca0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
ccb0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ccc0: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
ccd0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
cce0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ccf0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
cd00: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
cd10: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cd20: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
cd30: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
cd40: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
cd50: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
cd60: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
cd70: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
cd80: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
cd90: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
cda0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
cdb0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
cdc0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28  chan);..    if (
cdd0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
cde0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
cdf0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
ce00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
ce10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
ce20: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
ce30: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
ce40: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
ce50: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
ce60: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  , NULL);..    Tc
ce70: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
ce80: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
ce90: 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  NIMPORT", "CHANN
cea0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
ceb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
cec0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ced0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
cee0: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61   (Tcl_UnstackCha
cef0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
cf00: 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29  n) == TCL_ERROR)
cf10: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
cf20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
cf30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
cf40: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
cf90: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63   * CTX_Init -- c
cfa0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43  onstruct a SSL_C
cfb0: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20  TX instance. *. 
cfc0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
cfd0: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e  valid SSL_CTX in
cfe0: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a  stance or NULL..
cff0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
d000: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
d010: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
d020: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
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 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
d070: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
d080: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65  *.CTX_Init(State
d090: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
d0a0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
d0b0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69  oto, char *keyfi
d0c0: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69  le, char *certfi
d0d0: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  le,.    unsigned
d0e0: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69   char *key, unsi
d0f0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
d100: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e   int key_len, in
d110: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72  t cert_len, char
d120: 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68   *CApath,.    ch
d130: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72  ar *CAfile, char
d140: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
d150: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69  *ciphersuites, i
d160: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a  nt level, char *
d170: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20  DHparams) {.    
d180: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d190: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp = statePtr->i
d1a0: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43  nterp;.    SSL_C
d1b0: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
d1c0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
d1d0: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ds;.    Tcl_DStr
d1e0: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74  ing ds1;.    int
d1f0: 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20   off = 0, abort 
d200: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61  = 0;.    int loa
d210: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20  d_private_key;. 
d220: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54     const SSL_MET
d230: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20  HOD *method;..  
d240: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
d250: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70  d");..    if (!p
d260: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70  roto) {..Tcl_App
d270: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d280: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74  , "no valid prot
d290: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20  ocol selected", 
d2a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d2b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d2c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
d2d0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
d2e0: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
d2f0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
d300: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
d310: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d320: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d330: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
d340: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d350: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
d360: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
d370: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d380: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
d390: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d3a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d3b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d3c0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d3d0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
d3e0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d3f0: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69  L_NO_SSL3).    i
d400: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d410: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
d420: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d430: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d440: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL3 protocol no
d450: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d460: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
d470: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d480: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d490: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
d4a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d4b0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66  _NO_TLS1).    if
d4c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d4d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
d4e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d4f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d500: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
d510: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d520: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d530: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d540: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d550: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d560: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d570: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
d580: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d590: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d5a0: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
d5b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d5c0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
d5d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d5e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d5f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d600: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d610: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d620: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
d630: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d640: 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28  TLS1_2).    if (
d650: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d660: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
d670: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d690: 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.2 protocol 
d6a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d6b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d6c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d6d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d6e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
d6f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d700: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
d710: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d720: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d730: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
d740: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d750: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
d760: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d770: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d780: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d790: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d7a0: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
d7b0: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
d7c0: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
d7d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
d7e0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
d7f0: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
d800: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
d810: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
d820: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
d830: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f   (proto) {.#if O
d840: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d850: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
d860: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
d870: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
d880: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d890: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54  SSL2).    case T
d8a0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09  LS_PROTO_SSL2:..
d8b0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d8c0: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72  r ? SSLv2_server
d8d0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
d8e0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
d8f0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d900: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d910: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
d920: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d930: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
d940: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d950: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
d960: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
d970: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d980: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72  rver ? SSLv3_ser
d990: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
d9a0: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv3_client_meth
d9b0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d9c0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d9d0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
d9e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d9f0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
da00: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
da10: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
da20: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
da30: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
da40: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
da50: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
da60: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
da70: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
da80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
da90: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
daa0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dab0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
dac0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dad0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
dae0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
daf0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
db00: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
db10: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
db20: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
db30: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
db40: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
db50: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
db60: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
db70: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
db80: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
db90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dba0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
dbb0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
dbc0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
dbd0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
dbe0: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
dbf0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
dc00: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
dc10: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
dc20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
dc30: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
dc40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dc50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
dc60: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
dc70: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
dc80: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
dc90: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
dca0: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
dcb0: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
dcc0: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
dcd0: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
dce0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
dcf0: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
dd00: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
dd10: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
dd20: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
dd30: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
dd40: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
dd50: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
dd60: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
dd70: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
dd80: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
dd90: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
dda0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
ddb0: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
ddc0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
ddd0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dde0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f  NSSL_NO_SSL2)..o
ddf0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
de00: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
de10: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL2)   ? 0 : SS
de20: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
de30: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
de40: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
de50: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
de60: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c  _NO_SSL3)..off |
de70: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
de80: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
de90: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
dea0: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64  _NO_SSLv3);.#end
deb0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
dec0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
ded0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dee0: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
def0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
df00: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
df10: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
df20: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
df30: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
df40: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
df50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
df60: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
df70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
df80: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
df90: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dfa0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
dfb0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dfc0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
dfd0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dfe0: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
dff0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e000: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
e010: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e020: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
e030: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e040: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e050: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e060: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
e070: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e080: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
e090: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
e0a0: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
e0b0: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
e0c0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
e0d0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
e0e0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
e0f0: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
e100: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
e110: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  rn(NULL);.    }.
e120: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28  .    if (getenv(
e130: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20  SSLKEYLOGFILE)) 
e140: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b  {..SSL_CTX_set_k
e150: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63  eylog_callback(c
e160: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  tx, KeyLogCallba
e170: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  ck);.    }..#if 
e180: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
e190: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
e1a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e1b0: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  3).    if (proto
e1c0: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c   == TLS_PROTO_TL
e1d0: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58  S1_3) {..SSL_CTX
e1e0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
e1f0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
e200: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53  _3_VERSION);..SS
e210: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
e220: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
e230: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
e240: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
e250: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70      /* Force cip
e260: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72  her selection or
e270: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f  der by server */
e280: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76  .    if (!isServ
e290: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73  er) {..SSL_CTX_s
e2a0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
e2b0: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45  SSL_OP_CIPHER_SE
e2c0: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29  RVER_PREFERENCE)
e2d0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ;.    }..#if OPE
e2e0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
e2f0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
e300: 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64  L.    OpenSSL_ad
e310: 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73  d_all_algorithms
e320: 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68  (); /* Load ciph
e330: 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20  ers and digests 
e340: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53  */.#endif..    S
e350: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
e360: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
e370: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
e380: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
e390: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
e3a0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e3b0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
e3c0: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
e3d0: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
e3e0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e3f0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
e400: 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49  _OP_NO_COMPRESSI
e410: 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20  ON);./* disable 
e420: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e  compression even
e430: 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   if supported */
e440: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e450: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
e460: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
e470: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
e480: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  s */.#if OPENSSL
e490: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e4a0: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20  < 0x10101000L.  
e4b0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f    SSL_CTX_set_mo
e4c0: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45  de(ctx, SSL_MODE
e4d0: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a  _AUTO_RETRY);./*
e4e0: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64   handle new hand
e4f0: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72  shakes in backgr
e500: 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61  ound. On by defa
e510: 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ult in OpenSSL 1
e520: 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  .1.1. */.#endif.
e530: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
e540: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
e550: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20  ctx, 128);..    
e560: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69  /* Set user defi
e570: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70  ned ciphers, cip
e580: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20  her suites, and 
e590: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
e5a0: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  /.    if ((ciphe
e5b0: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  rs != NULL) && !
e5c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
e5d0: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70  er_list(ctx, cip
e5e0: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  hers)) {..Tcl_Ap
e5f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e600: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20  p, "Set ciphers 
e610: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
e620: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
e630: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e640: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e650: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e660: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
e670: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
e680: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e690: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
e6a0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
e6b0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
e6c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e6d0: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
e6e0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e6f0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e700: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e710: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e720: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e730: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
e740: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e750: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
e760: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
e770: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
e780: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e790: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
e7a0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
e7b0: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
e7c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
e7d0: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
e7e0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e7f0: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e800: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
e810: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
e820: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e830: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
e840: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
e850: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
e860: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
e870: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
e880: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
e890: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
e8a0: 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f   one */.#ifdef O
e8b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
e8c0: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
e8d0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
e8e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e8f0: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
e900: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
e910: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
e920: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
e930: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
e940: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e950: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48  .#else.    {..DH
e960: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72  * dh;..if (DHpar
e970: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
e980: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20      BIO *bio;.. 
e990: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77     bio = BIO_new
e9a0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61  _file(F2N(DHpara
e9b0: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a  ms, &ds), "r");.
e9c0: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b  .    if (!bio) {
e9d0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
e9e0: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41  ee(&ds);...Tcl_A
e9f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ea00: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66  rp, "Could not f
ea10: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72  ind DH parameter
ea20: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  s file", (char *
ea30: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
ea40: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
ea50: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
ea60: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50    }...    dh = P
ea70: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61  EM_read_bio_DHpa
ea80: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20  rams(bio, NULL, 
ea90: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  NULL, NULL);..  
eaa0: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b    BIO_free(bio);
eab0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
eac0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
ead0: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63   if (!dh) {...Tc
eae0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
eaf0: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
eb00: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65  t read DH parame
eb10: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c  ters from file",
eb20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
eb30: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
eb40: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
eb50: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
eb60: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70   SSL_CTX_set_tmp
eb70: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20  _dh(ctx, dh);.. 
eb80: 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a     DH_free(dh);.
eb90: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
eba0: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77  /* Use well know
ebb0: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  n DH parameters 
ebc0: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d  that have built-
ebd0: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70  in support in Op
ebe0: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66  enSSL */..    if
ebf0: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64   (!SSL_CTX_set_d
ec00: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20  h_auto(ctx, 1)) 
ec10: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
ec20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
ec30: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73  uld not enable s
ec40: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47  et DH auto: ", G
ec50: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
ec60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ec70: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ec80: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ec90: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ULL;..    }..}. 
eca0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
ecb0: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74   /* set our cert
ecc0: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c  ificate */.    l
ecd0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
ece0: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72  = 0;.    if (cer
ecf0: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  tfile != NULL) {
ed00: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
ed10: 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53  ey = 1;...if (SS
ed20: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
ed30: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
ed40: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64  F2N(certfile, &d
ed50: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
ed60: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20  _PEM) <= 0) {.. 
ed70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
ed80: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
ed90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
eda0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
edb0: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74  o set certificat
edc0: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
edd0: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f  le, ": ",...GET_
ede0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
edf0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ee00: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
ee10: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
ee20: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f  n NULL;..}..Tcl_
ee30: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ee40: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
ee50: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20   (cert != NULL) 
ee60: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
ee70: 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53  key = 1;..if (SS
ee80: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
ee90: 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20  icate_ASN1(ctx, 
eea0: 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20  cert_len, cert) 
eeb0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
eec0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eed0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
eee0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
eef0: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52  : ",...GET_ERR_R
ef00: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
ef10: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
ef20: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ef30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
ef40: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
ef50: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28   {..certfile = (
ef60: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64  char*)X509_get_d
ef70: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65  efault_cert_file
ef80: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  ();...if (SSL_CT
ef90: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
efa0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74  e_file(ctx, cert
efb0: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59  file, SSL_FILETY
efc0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
efd0: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41  #if 0..    Tcl_A
efe0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
eff0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75  rp, "unable to u
f000: 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69  se default certi
f010: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
f020: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
f030: 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28  .GET_ERR_REASON(
f040: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
f050: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
f060: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
f070: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e  return NULL;.#en
f080: 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  dif..}.    }..  
f090: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69    /* set our pri
f0a0: 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20  vate key */.    
f0b0: 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65  if (load_private
f0c0: 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79  _key) {..if (key
f0d0: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  file == NULL && 
f0e0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key == NULL) {..
f0f0: 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65      keyfile = ce
f100: 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20  rtfile;..}...if 
f110: 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (keyfile != NULL
f120: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20  ) {..    /* get 
f130: 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20  the private key 
f140: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f150: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
f160: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79   */..    if (key
f170: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  file == NULL) {.
f180: 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74  ..keyfile = cert
f190: 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  file;..    }... 
f1a0: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
f1b0: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69  se_PrivateKey_fi
f1c0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66  le(ctx, F2N(keyf
f1d0: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46  ile, &ds), SSL_F
f1e0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
f1f0: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  0) {...Tcl_DStri
f200: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f  ngFree(&ds);.../
f210: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
f220: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
f230: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
f240: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
f250: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f260: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
f270: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
f280: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f290: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f2a0: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65   public key file
f2b0: 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22   ", keyfile, " "
f2c0: 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f  ,...    GET_ERR_
f2d0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f2e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
f2f0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f300: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
f310: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
f320: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f330: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79  ..} else if (key
f340: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
f350: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
f360: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31  _PrivateKey_ASN1
f370: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63  (EVP_PKEY_RSA, c
f380: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29  tx, key,key_len)
f390: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c   <= 0) {.../* fl
f3a0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
f3b0: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
f3c0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
f3d0: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
f3e0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
f3f0: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
f400: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
f410: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
f420: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
f430: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f  lic key: ", GET_
f440: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
f450: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
f460: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f470: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
f480: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20  ;..    }..}../* 
f490: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  Now we know that
f4a0: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20   a key and cert 
f4b0: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67  have been set ag
f4c0: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53  ainst.. * the SS
f4d0: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66  L context */..if
f4e0: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b   (!SSL_CTX_check
f4f0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78  _private_key(ctx
f500: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
f510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f520: 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20  p, "private key 
f530: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f540: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70  he certificate p
f550: 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20  ublic key",.... 
f560: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c      (char *) NUL
f570: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f580: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f590: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
f5a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
f5b0: 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  et to use defaul
f5c0: 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66  t location and f
f5d0: 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69 63  ile for Certific
f5e0: 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43  ate Authority (C
f5f0: 41 29 20 63 65 72 74 69 66 69 63 61 74 65 73 2e  A) certificates.
f600: 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 72 69   The.     * veri
f610: 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72  fy path and stor
f620: 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
f630: 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43  den by the SSL_C
f640: 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e  ERT_DIR env var.
f650: 20 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65   The verify file
f660: 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f   can.     * be o
f670: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
f680: 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65   SSL_CERT_FILE e
f690: 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69  nv var. */.    i
f6a0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  f (!SSL_CTX_set_
f6b0: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70  default_verify_p
f6c0: 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62  aths(ctx)) {..ab
f6d0: 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ort++;.    }..  
f6e0: 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66    /* Overrides f
f6f0: 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 66 79  or the CA verify
f700: 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a   path and file *
f710: 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e  /.    {.#if OPEN
f720: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
f730: 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
f740: 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d 20  ..if (CApath != 
f750: 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21  NULL || CAfile !
f760: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54  = NULL) {..    T
f770: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a  cl_DString ds1;.
f780: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
f790: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f  X_load_verify_lo
f7a0: 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e  cations(ctx, F2N
f7b0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46  (CAfile, &ds), F
f7c0: 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31 29  2N(CApath, &ds1)
f7d0: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
f7e0: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
f7f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f800: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
f810: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09  ngFree(&ds1);...
f820: 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20      /* Set list 
f830: 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74  of CAs to send t
f840: 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65  o client when re
f850: 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e  questing a clien
f860: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  t certificate */
f870: 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f  ..    /* https:/
f880: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  /sourceforge.net
f890: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20  /p/tls/bugs/57/ 
f8a0: 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54  */..    /* XXX:T
f8b0: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65  ODO: Let the use
f8c0: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20  r supply values 
f8d0: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20  here instead of 
f8e0: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65  something that e
f8f0: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c  xists on the fil
f900: 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20  esystem */..    
f910: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
f920: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d  ME) *certNames =
f930: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74   SSL_load_client
f940: 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66  _CA_file(F2N(CAf
f950: 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20  ile, &ds));..   
f960: 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21   if (certNames !
f970: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f  = NULL) {...SSL_
f980: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_set_client_C
f990: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74  A_list(ctx, cert
f9a0: 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09  Names);..    }..
f9b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f9c0: 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65  ree(&ds);..}..#e
f9d0: 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 68 20  lse..if (CApath 
f9e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f9f0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
fa00: 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78  d_verify_dir(ctx
fa10: 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64  , F2N(CApath, &d
fa20: 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  s))) {...abort++
fa30: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
fa40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
fa50: 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 69  s);..}..if (CAfi
fa60: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
fa70: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
fa80: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65  load_verify_file
fa90: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65  (ctx, F2N(CAfile
faa0: 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f  , &ds))) {...abo
fab0: 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
fac0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fad0: 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a  e(&ds);...    /*
fae0: 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73   Set list of CAs
faf0: 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65   to send to clie
fb00: 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  nt when requesti
fb10: 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74  ng a client cert
fb20: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
fb30: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
fb40: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d  ME) *certNames =
fb50: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74   SSL_load_client
fb60: 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66  _CA_file(F2N(CAf
fb70: 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20  ile, &ds));..   
fb80: 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21   if (certNames !
fb90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f  = NULL) {...SSL_
fba0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_set_client_C
fbb0: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74  A_list(ctx, cert
fbc0: 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09  Names);..    }..
fbd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
fbe0: 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e  ree(&ds);..}.#en
fbf0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  dif.    }..    r
fc00: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
fc10: 2a 0a 20 2a 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 2d 2d  ----------------
fc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
fc60: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
fc70: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
fc80: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
fc90: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
fca0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
fcb0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
fcc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
fcd0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
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 2d 2d 2d 2d 2d 2d  ----------------
fd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd20: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
fd30: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
fd40: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
fd50: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
fd60: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
fd70: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
fd80: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
fd90: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
fda0: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
fdb0: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
fdc0: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
fdd0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
fde0: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
fdf0: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
fe00: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
fe10: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
fe20: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
fe30: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
fe40: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20  n;.    int nid, 
fe50: 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  res;.    (void) 
fe60: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
fe70: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
fe80: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
fe90: 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20  c < 2 || objc > 
fea0: 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20  3 || (objc == 3 
feb0: 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47  && !strcmp(Tcl_G
fec0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
fed0: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b  ), "-local"))) {
fee0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
fef0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
ff00: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68  jv, "?-local? ch
ff10: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
ff20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ff30: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
ff40: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20  annel Id */.    
ff50: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
ff60: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ff70: 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20  [(objc == 2 ? 1 
ff80: 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e  : 2)]);.    chan
ff90: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
ffa0: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65  l(interp, channe
ffb0: 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20  lName, &mode);. 
ffc0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
ffd0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
ffe0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
fff0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
10000 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
10010 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
10020 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
10030 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
10040 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
10050 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
10060 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
10070 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
10080 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
10090 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
100a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
100b0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
100c0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
100d0 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
100e0 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
100f0 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
10100 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
10110 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54  rp, "TLS", "STAT
10120 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  US", "CHANNEL", 
10130 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
10140 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
10150 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10160 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
10170 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c   = (State *) Tcl
10180 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
10190 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
101a0 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69      /* Get certi
101b0 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20  ficate for peer 
101c0 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69  or self */.    i
101d0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
101e0 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
101f0 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65  peer_certificate
10200 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
10210 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70  .    } else {..p
10220 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65  eer = SSL_get_ce
10230 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
10240 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
10250 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20      /* Get X509 
10260 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f  certificate info
10270 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72   */.    if (peer
10280 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c  ) {..objPtr = Tl
10290 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
102a0 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20  erp, peer);..if 
102b0 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20  (objc == 2) {.. 
102c0 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65     X509_free(pee
102d0 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20  r);..    peer = 
102e0 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  NULL;..}.    } e
102f0 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  lse {..objPtr = 
10300 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
10310 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a  , NULL);.    }..
10320 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65      /* Peer name
10330 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10340 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10350 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20  tr, "peername", 
10360 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d  SSL_get0_peernam
10370 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
10380 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45  , -1);.    LAPPE
10390 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
103a0 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20  bjPtr, "sbits", 
103b0 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62  SSL_get_cipher_b
103c0 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  its(statePtr->ss
103d0 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20  l, NULL));..    
103e0 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a  ciphers = (char*
103f0 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28  )SSL_get_cipher(
10400 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10410 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10420 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10430 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72  "cipher", cipher
10440 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  s, -1);..    /* 
10450 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20  Verify the X509 
10460 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73  certificate pres
10470 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65  ented by the pee
10480 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  r */.    LAPPEND
10490 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
104a0 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75  Ptr, "verifyResu
104b0 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66  lt",..X509_verif
104c0 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
104d0 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69  ing(SSL_get_veri
104e0 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
104f0 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a  tr->ssl)), -1);.
10500 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d  .    /* Verify m
10510 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20  ode */.    mode 
10520 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  = SSL_get_verify
10530 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
10540 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f  ssl);.    if (mo
10550 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
10560 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e  _NONE) {..LAPPEN
10570 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10580 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64  jPtr, "verifyMod
10590 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  e", "none", -1);
105a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
105b0 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50  cl_Obj *listObjP
105c0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
105d0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69  Obj(0, NULL);..i
105e0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
105f0 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20  ERIFY_PEER) {.. 
10600 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10610 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10620 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
10630 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10640 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09  ("peer", -1));..
10650 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10660 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
10670 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20  F_NO_PEER_CERT) 
10680 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
10690 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
106a0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
106b0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
106c0 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f  gObj("fail if no
106d0 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29   peer cert", -1)
106e0 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  );..}..if (mode 
106f0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c  && SSL_VERIFY_CL
10700 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20  IENT_ONCE) {..  
10710 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10720 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10730 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
10740 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10750 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d  "client once", -
10760 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
10770 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10780 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20  POST_HANDSHAKE) 
10790 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
107a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
107b0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
107c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
107d0 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73  gObj("post hands
107e0 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  hake", -1));..}.
107f0 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74  .LAPPEND_OBJ(int
10800 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
10810 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f  rifyMode", listO
10820 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20  bjPtr).    }..  
10830 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65    /* Verify mode
10840 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41   depth */.    LA
10850 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
10860 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
10870 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74  yDepth", SSL_get
10880 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74  _verify_depth(st
10890 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a  atePtr->ssl));..
108a0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68      /* Report th
108b0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
108c0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
108d0 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69  of the negotiati
108e0 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65  on */.    SSL_ge
108f0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
10900 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
10910 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20  &proto, &len);. 
10920 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10930 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10940 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70  alpn", (char *)p
10950 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
10960 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45   len);.    LAPPE
10970 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10980 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
10990 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  ", SSL_get_versi
109a0 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
109b0 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
109c0 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53  Valid for non-RS
109d0 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20  A signature and 
109e0 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69  TLS 1.3 */.    i
109f0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
10a00 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70  .res = SSL_get_p
10a10 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69  eer_signature_ni
10a20 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10a30 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c   &nid);.    } el
10a40 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
10a50 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69  get_signature_ni
10a60 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10a70 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20   &nid);.    }.  
10a80 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64    if (!res) {nid
10a90 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45   = 0;}.    LAPPE
10aa0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10ab0 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72  bjPtr, "signatur
10ac0 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c  eHashAlgorithm",
10ad0 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
10ae0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 28  , -1);..    if (
10af0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65  objc == 2) {..re
10b00 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  s = SSL_get_peer
10b10 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f  _signature_type_
10b20 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10b30 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
10b40 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
10b50 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10b60 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
10b70 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10b80 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65     }.    if (!re
10b90 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20  s) {nid = 0;}.  
10ba0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10bb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10bc0 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f  ignatureType", O
10bd0 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
10be0 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  -1);..    Tcl_Se
10bf0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10c00 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
10c10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10c20 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
10c70 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
10c80 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
10c90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10ca0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
10cb0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10cc0 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
10cd0 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
10ce0 2a 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 2d 2d 2d 2d  ----------------
10d20 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
10d30 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
10d40 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
10d50 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
10d60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10d70 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
10d80 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
10d90 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
10da0 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
10db0 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
10dc0 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
10dd0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
10de0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
10df0 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
10e00 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
10e10 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
10e20 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
10e30 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
10e40 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
10e50 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
10e60 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
10e70 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
10e80 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
10e90 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
10ea0 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20  ntData;..    if 
10eb0 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
10ec0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10ed0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10ee0 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
10ef0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
10f10 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
10f20 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
10f30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10f40 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
10f50 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
10f60 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
10f70 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
10f80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10f90 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
10fa0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
10fb0 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10fc0 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10fd0 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10fe0 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10ff0 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
11000 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
11010 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
11020 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11030 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
11040 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
11050 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
11060 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
11070 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
11080 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
11090 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
110a0 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43  , "TLS", "CONNEC
110b0 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22  TION", "CHANNEL"
110c0 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
110d0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
110e0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
110f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
11100 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
11110 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
11120 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
11130 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
11140 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
11150 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
11160 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
11170 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
11180 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
11190 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
111a0 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f   {../* connectio
111b0 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50  n state */..LAPP
111c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
111d0 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c  objPtr, "state",
111e0 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
111f0 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
11200 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
11210 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
11220 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
11230 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11240 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  Ptr, "servername
11250 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  ", SSL_get_serve
11260 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
11270 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
11280 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  name), -1);.../*
11290 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
112a0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
112b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
112c0 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
112d0 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
112e0 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  -1);.../* Renego
112f0 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
11300 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11310 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11320 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f   "renegotiation_
11330 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65  allowed", SSL_ge
11340 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74  t_secure_renegot
11350 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28  iation_support((
11360 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09  SSL *) ssl));...
11370 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20  /* Get security 
11380 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  level */..LAPPEN
11390 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
113a0 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f  jPtr, "security_
113b0 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  level", SSL_get_
113c0 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73  security_level(s
113d0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  sl));.../* Sessi
113e0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  on info */..LAPP
113f0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11400 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
11410 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73  n_reused", SSL_s
11420 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
11430 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  l));.../* Is ser
11440 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ver info */..LAP
11450 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11460 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65  , objPtr, "is_se
11470 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65  rver", SSL_is_se
11480 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  rver(ssl));.../*
11490 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50   Is DTLS */..LAP
114a0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
114b0 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74  , objPtr, "is_dt
114c0 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73  ls", SSL_is_dtls
114d0 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  (ssl));.    }.. 
114e0 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66     /* Cipher inf
114f0 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20  o */.    cipher 
11500 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
11510 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20  t_cipher(ssl);. 
11520 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d     if (cipher !=
11530 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
11540 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d  uf[BUFSIZ] = {0}
11550 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67  ;..int bits, alg
11560 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68  _bits;.../* Ciph
11570 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
11580 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11590 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
115a0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
115b0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
115c0 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d  1);.../* RFC nam
115d0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
115e0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
115f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
11600 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c  ndard_name", SSL
11610 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
11620 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
11630 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c  1);.../* OpenSSL
11640 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
11650 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11660 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11670 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20  "openssl_name", 
11680 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e  OPENSSL_cipher_n
11690 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73  ame(SSL_CIPHER_s
116a0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
116b0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
116c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65   number of secre
116d0 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20  t bits used for 
116e0 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20  cipher */..bits 
116f0 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  = SSL_CIPHER_get
11700 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61  _bits(cipher, &a
11710 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  lg_bits);..LAPPE
11720 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11730 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62  bjPtr, "secret_b
11740 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41  its", bits);..LA
11750 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11760 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72  , objPtr, "algor
11770 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f  ithm_bits", alg_
11780 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  bits);../* alg_b
11790 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
117a0 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
117b0 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
117c0 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
117d0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
117e0 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
117f0 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
11800 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
11810 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
11820 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
11830 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73  /.../* Indicates
11840 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70   which SSL/TLS p
11850 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20  rotocol version 
11860 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68  first defined th
11870 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  e cipher */..LAP
11880 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11890 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65   objPtr, "min_ve
118a0 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48  rsion", SSL_CIPH
118b0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
118c0 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
118d0 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a  * Cipher NID */.
118e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
118f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
11900 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20  pherNID", (char 
11910 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
11920 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68  _CIPHER_get_ciph
11930 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  er_nid(cipher)),
11940 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11950 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11960 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20  r, "digestNID", 
11970 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
11980 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
11990 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70  t_digest_nid(cip
119a0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
119b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
119c0 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63   objPtr, "keyExc
119d0 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72  hangeNID", (char
119e0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
119f0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f  L_CIPHER_get_kx_
11a00 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11a10 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11a20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11a30 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e  "authenticationN
11a40 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
11a50 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
11a60 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28  ER_get_auth_nid(
11a70 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
11a80 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68  ./* message auth
11a90 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
11aa0 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44  - Cipher is AEAD
11ab0 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68   (e.g. GCM or Ch
11ac0 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29  aCha20/Poly1305)
11ad0 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41   or not */../* A
11ae0 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63  uthenticated Enc
11af0 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73  ryption with ass
11b00 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45  ociated data (AE
11b10 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41  AD) check */..LA
11b20 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11b30 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11b40 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c  er_is_aead", SSL
11b50 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28  _CIPHER_is_aead(
11b60 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44  cipher));.../* D
11b70 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e  igest used durin
11b80 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61  g the SSL/TLS ha
11b90 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69  ndshake when usi
11ba0 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a  ng the cipher. *
11bb0 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48  /..md = SSL_CIPH
11bc0 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65  ER_get_handshake
11bd0 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b  _digest(cipher);
11be0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11bf0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68  terp, objPtr, "h
11c00 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22  andshake_digest"
11c10 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44  , (char *)EVP_MD
11c20 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a  _name(md), -1);.
11c30 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c  ../* Get OpenSSL
11c40 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f  -specific ID, no
11c50 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41  t IANA ID */..LA
11c60 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11c70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11c80 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  r_id", (int) SSL
11c90 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
11ca0 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77  ipher));.../* Tw
11cb0 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69  o-byte ID used i
11cc0 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63  n the TLS protoc
11cd0 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ol of the given 
11ce0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11cf0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11d00 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
11d10 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
11d20 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f  CIPHER_get_proto
11d30 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b  col_id(cipher));
11d40 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65  .../* Textual de
11d50 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
11d60 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28   cipher */..if (
11d70 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
11d80 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62  iption(cipher, b
11d90 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
11da0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
11db0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11dc0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65  erp, objPtr, "de
11dd0 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c  scription", buf,
11de0 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a   -1);..}.    }..
11df0 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
11e00 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
11e10 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
11e20 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
11e30 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
11e40 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
11e50 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
11e60 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
11e70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
11e80 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
11e90 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
11ea0 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a  ion_id, *proto;.
11eb0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
11ec0 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
11ed0 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
11ee0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
11ef0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
11f00 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
11f10 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
11f20 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
11f30 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
11f40 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
11f50 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
11f60 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  2);..LAPPEND_STR
11f70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11f80 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
11f90 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  ) proto, (Tcl_Si
11fa0 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
11fb0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
11fc0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
11fd0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
11fe0 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
11ff0 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
12000 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
12010 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
12020 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
12030 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
12040 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12050 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72  tr, "npn", (char
12060 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
12070 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e  Size) ulen);.#en
12080 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62  dif.../* Resumab
12090 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c  le session */..L
120a0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
120b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73  rp, objPtr, "res
120c0 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53  umable", SSL_SES
120d0 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c  SION_is_resumabl
120e0 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  e(session));.../
120f0 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
12100 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
12110 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c  nce epoch) */..L
12120 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
12130 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
12140 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  rt_time", SSL_SE
12150 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73  SSION_get_time(s
12160 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
12170 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53  imeout value - S
12180 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f  SL_CTX_get_timeo
12190 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  ut (in seconds) 
121a0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
121b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
121c0 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f   "timeout", SSL_
121d0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
121e0 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  out(session));..
121f0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d  ./* Session id -
12200 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c   TLSv1.2 and bel
12210 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73  ow only */..sess
12220 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
12230 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
12240 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
12250 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
12260 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
12270 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
12280 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
12290 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65  ) ulen);.../* Se
122a0 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ssion context */
122b0 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
122c0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
122d0 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69  id_context(sessi
122e0 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
122f0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12300 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12310 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73  sion_context", s
12320 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
12330 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
12340 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
12350 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
12360 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
12370 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
12380 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
12390 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
123a0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
123b0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69  Ptr, "session_ti
123c0 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28  cket", ticket, (
123d0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
123e0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
123f0 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69  cket lifetime hi
12400 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  nt (in seconds) 
12410 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
12420 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12430 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c   "lifetime", SSL
12440 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
12450 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
12460 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
12470 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
12480 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  a */.#if OPENSSL
12490 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
124a0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53  < 0x30000000L..S
124b0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
124c0 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28  ticket_appdata((
124d0 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73  SSL_SESSION *) s
124e0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
124f0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
12500 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
12510 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74   objPtr, "ticket
12520 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b  _app_data", tick
12530 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
12540 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f  en2);.#endif.../
12550 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79  * Get master key
12560 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f   */..len2 = SSL_
12570 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74  SESSION_get_mast
12580 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20  er_key(session, 
12590 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f  buffer, SSL_MAX_
125a0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
125b0 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  H);..LAPPEND_BAR
125c0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
125d0 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22  tr, "master_key"
125e0 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53  , buffer, (Tcl_S
125f0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
12600 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20   Compression id 
12610 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  */..unsigned int
12620 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f   id = SSL_SESSIO
12630 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69  N_get_compress_i
12640 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50  d(session);..LAP
12650 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12660 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12670 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d  ssion_id", id ==
12680 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e   1 ? "zlib" : "n
12690 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
126a0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73  ..    /* Compres
126b0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
126c0 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c   if (ssl != NULL
126d0 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ) {.#ifdef HAVE_
126e0 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a  SSL_COMPRESSION.
126f0 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48  .const COMP_METH
12700 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b  OD *comp, *expn;
12710 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74  ..comp = SSL_get
12720 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73  _current_compres
12730 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e  sion(ssl);..expn
12740 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
12750 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c  nt_expansion(ssl
12760 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  );...LAPPEND_STR
12770 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12780 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
12790 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  comp ? SSL_COMP_
127a0 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a  get_name(comp) :
127b0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c   "none", -1);..L
127c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
127d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61  p, objPtr, "expa
127e0 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53  nsion", expn ? S
127f0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
12800 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c  (expn) : "none",
12810 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50   -1);.#else..LAP
12820 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12830 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12840 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20  ssion", "none", 
12850 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
12860 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12870 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22  , "expansion", "
12880 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64  none", -1);.#end
12890 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
128a0 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   Server info */.
128b0 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65      {..long mode
128c0 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73   = SSL_CTX_get_s
128d0 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
128e0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
128f0 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09  ;..char *msg;...
12900 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
12910 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
12920 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66  ..    msg = "off
12930 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12940 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12950 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09  ACHE_CLIENT) {..
12960 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e      msg = "clien
12970 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  t";..} else if (
12980 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
12990 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a  CACHE_SERVER) {.
129a0 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76  .    msg = "serv
129b0 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  er";..} else if 
129c0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
129d0 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09  _CACHE_BOTH) {..
129e0 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22      msg = "both"
129f0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
12a00 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22   msg = "unknown"
12a10 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54  ;..}..LAPPEND_ST
12a20 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12a30 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  , "session_cache
12a40 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29  _mode", msg, -1)
12a50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12a60 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f  CA List */.    /
12a70 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65  * IF not a serve
12a80 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67  r, same as SSL_g
12a90 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74  et0_peer_CA_list
12aa0 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65  . If server same
12ab0 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   as SSL_CTX_get_
12ac0 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a  client_CA_list *
12ad0 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20  /.    listPtr = 
12ae0 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
12af0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41  , NULL);.    STA
12b00 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
12b10 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69   *ca_list;.    i
12b20 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53  f ((ca_list = SS
12b30 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  L_get_client_CA_
12b40 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55  list(ssl)) != NU
12b50 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66  LL) {..char buff
12b60 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72  er[BUFSIZ];..for
12b70 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
12b80 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
12b90 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29  m(ca_list); i++)
12ba0 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d   {..    X509_NAM
12bb0 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30  E *name = sk_X50
12bc0 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f  9_NAME_value(ca_
12bd0 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69  list, i);..    i
12be0 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30  f (name) {...X50
12bf0 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e  9_NAME_oneline(n
12c00 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46  ame, buffer, BUF
12c10 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  SIZ);...Tcl_List
12c20 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12c30 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
12c40 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12c50 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
12c60 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
12c70 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
12c80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12c90 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50   "caList", listP
12ca0 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  tr);.    LAPPEND
12cb0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
12cc0 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e  Ptr, "caListCoun
12cd0 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  t", sk_X509_NAME
12ce0 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a  _num(ca_list));.
12cf0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
12d00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
12d10 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
12d20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
12d30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
12d80 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  sionObjCmd -- re
12d90 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72  turn version str
12da0 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  ing from OpenSSL
12db0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
12dc0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
12dd0 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
12de0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
12df0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
12e00 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
12e50 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c  VersionObjCmd(Cl
12e60 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
12e70 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
12e80 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
12e90 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
12ea0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
12eb0 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
12ec0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
12ed0 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69  ntData;.    (voi
12ee0 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f  d) objc;.    (vo
12ef0 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64  id) objv;..    d
12f00 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
12f10 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
12f20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12f30 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
12f40 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20  _TEXT, -1);.    
12f50 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12f60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
12f70 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
12f80 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_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 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a  --. *. * MiscObj
12fe0 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d  Cmd -- misc comm
12ff0 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ands. *. * Resul
13000 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
13010 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
13020 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
13030 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
13040 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
13090 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c  nt.MiscObjCmd(Cl
130a0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
130b0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
130c0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
130d0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
130e0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
130f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
13100 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d  r *commands [] =
13110 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65   { "req", "strre
13120 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20  q", NULL };.    
13130 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43  enum command { C
13140 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20  _REQ, C_STRREQ, 
13150 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54  C_DUMMY };.    T
13160 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20  cl_Size cmd;.   
13170 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20   int isStr;.    
13180 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38  char buffer[1638
13190 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  4];.    (void) c
131a0 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
131b0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
131c0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
131d0 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
131e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
131f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
13200 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
13210 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13220 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
13230 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
13240 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13250 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
13260 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26   "command", 0, &
13270 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
13280 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
13290 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
132a0 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
132b0 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
132c0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
132d0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
132e0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
132f0 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
13300 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
13310 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
13320 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
13330 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
13340 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
13350 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
13360 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
13370 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69  stv;..    Tcl_Si
13380 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69  ze listc;..    i
13390 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  nt i;...    BIO 
133a0 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
133b0 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b   char *k_C="",*k
133c0 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a  _ST="",*k_L="",*
133d0 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c  k_O="",*k_OU="",
133e0 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69  *k_CN="",*k_Emai
133f0 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20  l="";..    char 
13400 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c  *keyout,*pemout,
13410 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b  *str;..    int k
13420 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c  eysize,serial=0,
13430 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f  days=365;..#if O
13440 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13450 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13460 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
13470 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
13480 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
13490 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
134a0 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
134b0 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
134c0 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
134d0 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
134e0 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
134f0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13500 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
13510 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
13520 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
13530 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13540 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
13550 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13560 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
13570 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
13580 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
13590 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
135a0 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
135b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
135c0 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
135d0 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
135e0 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
135f0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
13600 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
13610 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
13620 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13630 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
13640 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
13650 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
13660 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
13670 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
13680 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74  , objv[5], &list
13690 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43  c, &listv) != TC
136a0 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65  L_OK) {...    re
136b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
136c0 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74  ..}....if ((list
136d0 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20  c%2) != 0) {... 
136e0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
136f0 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61  (interp,"Informa
13700 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68  tion list must h
13710 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20  ave even number 
13720 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55  of arguments",NU
13730 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
13740 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13750 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c  ...for (i=0; i<l
13760 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09  istc; i+=2) {...
13770 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53      str=Tcl_GetS
13780 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b  tring(listv[i]);
13790 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d  ...    if (strcm
137a0 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30  p(str,"days")==0
137b0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
137c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
137d0 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
137e0 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  days)!=TCL_OK)..
137f0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13800 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
13810 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13820 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30  str,"serial")==0
13830 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13840 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13850 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13860 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29  serial)!=TCL_OK)
13870 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
13880 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13890 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
138a0 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b  p(str,"C")==0) {
138b0 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53  ....k_C=Tcl_GetS
138c0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
138d0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
138e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
138f0 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  ST")==0) {....k_
13900 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ST=Tcl_GetString
13910 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13920 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13930 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d  trcmp(str,"L")==
13940 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f  0) {....k_L=Tcl_
13950 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13960 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13970 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13980 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"O")==0) {...
13990 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_O=Tcl_GetStri
139a0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
139b0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
139c0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22  (strcmp(str,"OU"
139d0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d  )==0) {....k_OU=
139e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
139f0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13a00 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13a10 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29  mp(str,"CN")==0)
13a20 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47   {....k_CN=Tcl_G
13a30 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13a40 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13a50 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13a60 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b  r,"Email")==0) {
13a70 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f  ....k_Email=Tcl_
13a80 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13a90 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13aa0 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74  lse {....Tcl_Set
13ab0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55  Result(interp,"U
13ac0 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72  nknown parameter
13ad0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75  ",NULL);....retu
13ae0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13af0 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d      }...}..    }
13b00 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13b10 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13b20 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13b30 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a  bne = BN_new();.
13b40 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e  .    rsa = RSA_n
13b50 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20  ew();..    pkey 
13b60 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29  = EVP_PKEY_new()
13b70 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d  ;..    if (bne =
13b80 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d  = NULL || rsa ==
13b90 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d   NULL || pkey ==
13ba0 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74   NULL || !BN_set
13bb0 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34  _word(bne,RSA_F4
13bc0 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65  ) ||...!RSA_gene
13bd0 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c  rate_key_ex(rsa,
13be0 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e   keysize, bne, N
13bf0 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45  ULL) || !EVP_PKE
13c00 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65  Y_assign_RSA(pke
13c10 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50  y, rsa)) {...EVP
13c20 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13c30 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28  ;.../* RSA_free(
13c40 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45  rsa); freed by E
13c50 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a  VP_PKEY_free */.
13c60 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
13c70 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20  #else..    pkey 
13c80 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75  = EVP_RSA_gen((u
13c90 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79  nsigned int) key
13ca0 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20  size);..    ctx 
13cb0 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e  = EVP_PKEY_CTX_n
13cc0 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09  ew(pkey,NULL);..
13cd0 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20      if (pkey == 
13ce0 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e  NULL || ctx == N
13cf0 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ULL || !EVP_PKEY
13d00 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78  _keygen_init(ctx
13d10 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59  ) ||...!EVP_PKEY
13d20 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79  _CTX_set_rsa_key
13d30 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65  gen_bits(ctx, ke
13d40 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50  ysize) || !EVP_P
13d50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20  KEY_keygen(ctx, 
13d60 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f  &pkey)) {...EVP_
13d70 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13d80 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ...EVP_PKEY_CTX_
13d90 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69  free(ctx);.#endi
13da0 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  f...Tcl_SetResul
13db0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
13dc0 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
13dd0 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
13de0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13df0 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  R;..    } else {
13e00 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a  ...if (isStr) {.
13e10 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
13e20 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a  w(BIO_s_mem());.
13e30 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
13e40 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
13e50 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
13e60 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
13e70 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
13e80 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
13e90 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
13ea0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
13eb0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
13ec0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
13ed0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13ee0 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65  erp,keyout,buffe
13ef0 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
13f00 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
13f10 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
13f20 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
13f30 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
13f40 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
13f50 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
13f60 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74  ename(out,keyout
13f70 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
13f80 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
13f90 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
13fa0 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
13fb0 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f  );...    /* PEM_
13fc0 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69  write_bio_RSAPri
13fd0 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61  vateKey(out, rsa
13fe0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c  , NULL, NULL, 0,
13ff0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f   NULL, NULL); */
14000 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
14010 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a  all(out);.. .}..
14020 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39  ..if ((cert=X509
14030 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b  _new())==NULL) {
14040 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
14050 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
14060 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65  or generating ce
14070 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73  rtificate reques
14080 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  t",NULL);...    
14090 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
140a0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
140b0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
140c0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
140d0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
140e0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72  ;.#endif...    r
140f0 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
14100 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
14110 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
14120 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
14130 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
14140 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
14150 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
14160 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
14170 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
14180 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
14190 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
141a0 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
141b0 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
141c0 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35  0*24*days);...X5
141d0 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65  09_set_pubkey(ce
141e0 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d  rt,pkey);....nam
141f0 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
14200 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
14210 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14220 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14230 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
14240 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14250 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
14260 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14270 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14280 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14290 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
142a0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
142b0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54  ned char *) k_ST
142c0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
142d0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
142e0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
142f0 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
14300 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14310 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20  ed char *) k_L, 
14320 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14330 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14340 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
14350 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14360 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14370 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31   char *) k_O, -1
14380 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14390 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
143a0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
143b0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
143c0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
143d0 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
143e0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
143f0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14400 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
14410 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14420 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14430 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31  char *) k_CN, -1
14440 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14450 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14460 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
14470 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
14480 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14490 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61  ed char *) k_Ema
144a0 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  il, -1, -1, 0);.
144b0 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a  ...X509_set_subj
144c0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61  ect_name(cert,na
144d0 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30  me);....if (!X50
144e0 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79  9_sign(cert,pkey
144f0 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20  ,EVP_sha256())) 
14500 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65  {...    X509_fre
14510 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45  e(cert);...    E
14520 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14530 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14540 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
14550 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
14560 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
14570 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63  .#endif...    Tc
14580 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
14590 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
145a0 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
145b0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
145c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
145d0 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20  }....if (isStr) 
145e0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
145f0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
14600 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
14610 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
14620 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ert);...    i=BI
14630 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
14640 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
14650 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
14660 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
14670 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
14680 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
14690 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
146a0 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
146b0 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
146c0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
146d0 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
146e0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
146f0 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
14700 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
14710 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
14720 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  pemout);...    P
14730 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
14740 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14750 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
14760 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  out);...}....X50
14770 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
14780 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14790 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
147a0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
147b0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
147c0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
147d0 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ndif..    }..}..
147e0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
147f0 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  lt:..break;.    
14800 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
14810 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  _OK;.}.../******
14820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14830 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20  /* Init         
14840 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
14860 2a 0a 20 2a 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 2d  ----------------
148a0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
148b0 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
148c0 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
148d0 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
148e0 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
148f0 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
14900 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
14910 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
14920 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
14930 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
14940 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
14950 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14960 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
14970 0a 20 2a 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 2d 2d  ----------------
149b0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
149c0 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62  Tls_Free(char *b
149d0 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53  lockPtr) {.    S
149e0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
149f0 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50   (State *)blockP
14a00 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
14a10 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
14a20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65   Tls_Clean(state
14a30 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65  Ptr);.    ckfree
14a40 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a  (blockPtr);.}...
14a50 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
14aa0 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20  ls_Clean --. *. 
14ab0 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
14ac0 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
14ad0 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
14ae0 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
14af0 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
14b00 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14b10 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20  falls below 1.  
14b20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62  This should. *.b
14b30 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f  e called synchro
14b40 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c  nously by the Cl
14b50 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20  oseProc, not in 
14b60 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c  the. *.Eventuall
14b70 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  yFree callback..
14b80 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
14b90 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
14ba0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
14bb0 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
14bc0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
14c10 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74  oid Tls_Clean(St
14c20 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b  ate *statePtr) {
14c30 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
14c40 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a  lled");..    /*.
14c50 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73       * we're ass
14c60 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20  uming here that 
14c70 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72  we're single-thr
14c80 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20  eaded.     */.  
14c90 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14ca0 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
14cb0 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
14cc0 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
14cd0 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
14ce0 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
14cf0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e  tePtr->timer = N
14d00 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
14d10 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
14d20 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28  otos) {..ckfree(
14d30 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14d40 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  );..statePtr->pr
14d50 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  otos = NULL;.   
14d60 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14d70 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20  Ptr->bio) {../* 
14d80 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53  This will call S
14d90 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67  SL_shutdown. Bug
14da0 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72   1414045 */..dpr
14db0 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61  intf("BIO_free_a
14dc0 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ll(%p)", statePt
14dd0 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72  r->bio);..BIO_fr
14de0 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d  ee_all(statePtr-
14df0 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72  >bio);..statePtr
14e00 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->bio = NULL;.  
14e10 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14e20 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70  ePtr->ssl) {..dp
14e30 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28  rintf("SSL_free(
14e40 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
14e50 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28  ssl);..SSL_free(
14e60 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
14e70 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d  .statePtr->ssl =
14e80 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14e90 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
14ea0 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66  tx) {..SSL_CTX_f
14eb0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ree(statePtr->ct
14ec0 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  x);..statePtr->c
14ed0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  tx = NULL;.    }
14ee0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14ef0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  r->callback) {..
14f00 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
14f10 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
14f20 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ack);..statePtr-
14f30 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c  >callback = NULL
14f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
14f50 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
14f60 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  rd) {..Tcl_DecrR
14f70 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
14f80 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74  ->password);..st
14f90 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
14fa0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14fb0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14fc0 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65  >vcmd) {..Tcl_De
14fd0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
14fe0 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61  Ptr->vcmd);..sta
14ff0 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55  tePtr->vcmd = NU
15000 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LL;.    }..    d
15010 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
15020 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c  g");.}...#if TCL
15030 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e  _MAJOR_VERSION >
15040 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56   8.#define MIN_V
15050 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c  ERSION "9.0".#el
15060 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56  se.#define MIN_V
15070 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e  ERSION "8.5".#en
15080 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  dif../*. *------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
150d0 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
150e0 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
150f0 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
15100 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
15110 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
15120 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
15130 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
15140 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
15150 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
15160 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
15170 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
15180 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
15190 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
151a0 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
151b0 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
151c0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
151d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c  ---------. */.DL
15220 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
15230 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
15240 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63  *interp) {.    c
15250 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
15260 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
15270 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
15280 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
15290 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  };..    dprintf(
152a0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64  "Called");..#ifd
152b0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
152c0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
152d0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d  tStubs(interp, M
152e0 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
152f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
15300 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15310 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
15320 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65   (Tcl_PkgRequire
15330 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
15340 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
15350 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
15360 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15370 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73    }..    if (Tls
15380 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
15390 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
153a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
153b0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
153c0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
153d0 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ary", (char *) N
153e0 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
153f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
15400 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15410 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15420 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c   "tls::ciphers",
15430 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20   CiphersObjCmd, 
15440 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15450 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15460 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15470 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15480 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15490 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f   "tls::connectio
154a0 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
154b0 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
154c0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
154d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
154e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
154f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15500 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15510 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
15520 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43  dshakeObjCmd, (C
15530 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15540 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15550 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15560 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15570 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15580 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d  tls::import", Im
15590 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
155a0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
155b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
155c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
155d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
155e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
155f0 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e  s::unimport", Un
15600 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  importObjCmd, (C
15610 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15620 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15630 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15640 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15650 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15660 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74  tls::status", St
15670 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  atusObjCmd, (Cli
15680 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15690 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
156a0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
156b0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
156c0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
156d0 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
156e0 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
156f0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15700 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15710 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15720 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15730 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15740 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62  s::misc", MiscOb
15750 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15760 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
15770 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15780 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15790 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
157a0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f  nterp, "tls::pro
157b0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f  tocols", Protoco
157c0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  lsObjCmd, (Clien
157d0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
157e0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
157f0 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  *) NULL);..    i
15800 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63  f (interp) {..Tc
15810 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  l_Eval(interp, t
15820 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29  lsTclInitScript)
15830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
15840 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn Tcl_PkgProvi
15850 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41  de(interp, PACKA
15860 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45  GE_NAME, PACKAGE
15870 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a  _VERSION);.}../*
15880 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
158c0 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
158d0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e  -------*. *.Stan
15910 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72  dard procedure r
15920 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64  equired by 'load
15930 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  '.. *.Initialize
15940 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  s this extension
15950 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65   for a safe inte
15960 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d  rpreter.. *.----
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
159a0 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
159b0 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73  :. *..As of 'Tls
159c0 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73  _Init'. *. *.Res
159d0 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64  ult:. *..A stand
159e0 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f  ard Tcl error co
159f0 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15a30 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
15a40 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28  nt Tls_SafeInit(
15a50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15a60 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  rp) {.    dprint
15a70 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
15a80 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74   return(Tls_Init
15a90 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a  (interp));.}../*
15aa0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15ae0 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20  .TlsLibInit --. 
15af0 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61  -----*. *.Initia
15b30 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
15b40 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
15b50 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  cation. *.------
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
15b90 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  *.Side effects:.
15ba0 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20   *..initializes 
15bb0 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
15bc0 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f  *.Result:. *..no
15bd0 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15c10 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
15c20 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
15c30 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20  initialize) {.  
15c40 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69    static int ini
15c50 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20  tialized = 0;.  
15c60 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54    int status = T
15c70 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  CL_OK;.#if defin
15c80 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15c90 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15ca0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15cb0 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73  size_t num_locks
15cc0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
15cd0 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20   (uninitialize) 
15ce0 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69  {..if (!initiali
15cf0 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69  zed) {..    dpri
15d00 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
15d10 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20  initialize, but 
15d20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69  we are not initi
15d30 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20  alized");...    
15d40 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
15d50 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73  .}...dprintf("As
15d60 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15d70 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  ize");..#if defi
15d80 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15d90 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15da0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
15db0 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
15dc0 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63  t_mx);...if (loc
15dd0 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28  ks) {..    free(
15de0 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63  locks);..    loc
15df0 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ks = NULL;..    
15e00 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
15e10 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69  .}.#endif..initi
15e20 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66  alized = 0;..#if
15e30 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15e40 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15e50 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15e60 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
15e70 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
15e80 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43  ndif...return(TC
15e90 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  L_OK);.    }..  
15ea0 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
15eb0 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
15ec0 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
15ed0 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
15ee0 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29  ..return(status)
15ef0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15f00 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
15f10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15f20 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15f30 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15f40 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
15f50 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
15f60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e  );.#endif.    in
15f70 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
15f80 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15f90 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15fa0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15fb0 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63  ADS).    num_loc
15fc0 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  ks = 1;.    lock
15fd0 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e  sCount = (int) n
15fe0 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f  um_locks;.    lo
15ff0 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  cks = malloc(siz
16000 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
16010 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65  m_locks);.    me
16020 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73  mset(locks, 0, s
16030 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
16040 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64  num_locks);.#end
16050 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  if..    /* Initi
16060 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72  alize BOTH libcr
16070 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e  ypto and libssl.
16080 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f   */.    OPENSSL_
16090 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c  init_ssl(OPENSSL
160a0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53  _INIT_LOAD_SSL_S
160b0 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c  TRINGS | OPENSSL
160c0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54  _INIT_LOAD_CRYPT
160d0 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45  O_STRINGS..| OPE
160e0 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
160f0 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e  L_CIPHERS | OPEN
16100 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
16110 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b  _DIGESTS, NULL);
16120 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63  ..    BIO_new_tc
16130 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66  l(NULL, 0);..#if
16140 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   0.    /*.     *
16150 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76   XXX:TODO: Remov
16160 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20  e this code and 
16170 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
16180 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66  a check.     * f
16190 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70  or enough entrop
161a0 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79  y and do not try
161b0 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
161c0 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62  wn.     * terrib
161d0 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20  le entropy.     
161e0 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  */.    /*.     *
161f0 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   Seed the random
16200 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
16210 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
16220 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69  rary,.     * usi
16230 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20  ng the do/while 
16240 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73  construct becaus
16250 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74  e of the bug not
16260 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  e in the.     * 
16270 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68  OpenSSL FAQ at h
16280 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73  ttp://www.openss
16290 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61  l.org/support/fa
162a0 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20  q.html#USER1.   
162b0 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63    *.     * The c
162c0 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c  rux of the probl
162d0 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72  em is that Solar
162e0 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61  is 7 does not ha
162f0 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76  ve a.     * /dev
16300 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f  /random or /dev/
16310 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73  urandom device s
16320 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68  o it cannot gath
16330 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a  er enough.     *
16340 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68   entropy from th
16350 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68  e RAND_seed() wh
16360 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a  en TLS initializ
16370 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20  es and refuses. 
16380 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74      * to go furt
16390 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72  her. Earlier ver
163a0 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c  sions of OpenSSL
163b0 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61   carried on rega
163c0 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a  rdless..     */.
163d0 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67      srand((unsig
163e0 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74  ned int) time((t
163f0 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b  ime_t *) NULL));
16400 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28  .    do {..for (
16410 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69  i = 0; i < 16; i
16420 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73  ++) {..    rnd_s
16430 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68  eed[i] = 1 + (ch
16440 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e  ar) (255.0 * ran
16450 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e  d()/(RAND_MAX+1.
16460 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65  0));..}..RAND_se
16470 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a  ed(rnd_seed, siz
16480 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a  eof(rnd_seed));.
16490 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e      } while (RAN
164a0 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29  D_status() != 1)
164b0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ;.#endif..#if de
164c0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
164d0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
164e0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
164f0 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28  Tcl_MutexUnlock(
16500 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
16510 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74  f..    return(st
16520 61 74 75 73 29 3b 0a 7d 0a                       atus);.}.