Hex Artifact Content

Artifact 57bb811ceead3272069a48ef4bfe5abc51d5d393fb77329329c32a927eaa9403:


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: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20  * Callbacks     
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a  ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53  *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63  void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74   ret) {.    Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61  tr;.    char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72  jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  ;..    cmdPtr = 
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  ack);..#if 0.   
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65  _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79  v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70  et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d  (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65  0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73  rror */..    Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20   SSL_ERROR(ssl, 
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  0));..    return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ;..}.    }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  f.    if (where 
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f  wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b  Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  inor, -1));..   
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53   if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42  L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c  _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74  StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ssl), -1));.    
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53  cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a  ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69  j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31  ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ));.    }.    Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54  tatePtr);..    T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f  cmdPtr);.    (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  L);.    Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  ;..    Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61  . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69  tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20  cate validation 
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73  process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74  ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20  e is inspected. 
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76  *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61  lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ck bound to the 
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72  socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20  n one of:. *.   
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20   invalid. *.    
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70  valid. *.    emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63  ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69  hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a  cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d  lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20  tr, *result;.   
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a   char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20  string;.    int 
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20  length;.    SSL 
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29    *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20  et_ex_data(ctx, 
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f  SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69  X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20  dx());.    X509 
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53   *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72  TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a  rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  sl);.    Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d      int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28  get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72  ctx);.    int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74  CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  x);.    int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29  Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20  ;..    if (!ok) 
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61  {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (err);.    } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 4e 55  e {..errStr = NU
1870: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
1880: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
1890: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
18a0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  j*)NULL) {..if (
18b0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
18c0: 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41   & SSL_VERIFY_FA
18d0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
18e0: 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  RT) {..    retur
18f0: 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  n ok;..} else {.
1900: 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09  .    return 1;..
1910: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50  }.    }.    cmdP
1920: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
1930: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
1940: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  callback);..    
1950: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1960: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1970: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1980: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
1990: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
19a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
19b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
19c0: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
19d0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
19e0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
19f0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1a00: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1a10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1a20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1a30: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
1a40: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
1a50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1a60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1a70: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
1a80: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
1a90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1aa0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1ab0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1ac0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
1ad0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
1ae0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1af0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1b00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1b10: 6a 28 65 72 72 53 74 72 20 3f 20 65 72 72 53 74  j(errStr ? errSt
1b20: 72 20 3a 20 22 22 2c 20 2d 31 29 29 3b 0a 0a 20  r : "", -1));.. 
1b30: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
1b40: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
1b50: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
1b60: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
1b70: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
1b80: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
1b90: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43  ags |= TLS_TCL_C
1ba0: 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 63  ALLBACK;..    Tc
1bb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
1bc0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65  mdPtr);.    code
1bd0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
1be0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1bf0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
1c00: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
1c10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a  != TCL_OK) {../*
1c20: 20 49 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72   It got an error
1c30: 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65   - reject the ce
1c40: 72 74 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 23  rtificate...*/.#
1c50: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
1c60: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
1c70: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
1c80: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
1c90: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
1ca0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
1cb0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
1cc0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
1cd0: 29 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20  );.#endif..ok = 
1ce0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  0;.    } else {.
1cf0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  .result = Tcl_Ge
1d00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d10: 70 29 3b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63  p);..string = Tc
1d20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1d30: 62 6a 28 72 65 73 75 6c 74 2c 20 26 6c 65 6e 67  bj(result, &leng
1d40: 74 68 29 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 74  th);../* An empt
1d50: 79 20 72 65 73 75 6c 74 20 6c 65 61 76 65 73 20  y result leaves 
1d60: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63  verification unc
1d70: 68 61 6e 67 65 64 2e 09 2a 2f 0a 09 69 66 20 28  hanged..*/..if (
1d80: 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 26  string != NULL &
1d90: 26 20 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a  & length > 0) {.
1da0: 09 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
1db0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1dc0: 74 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f  terp, result, &o
1dd0: 6b 29 3b 0a 09 20 20 20 20 69 66 20 28 63 6f 64  k);..    if (cod
1de0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
1df0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
1e00: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
1e10: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
1e20: 4e 20 3c 20 36 29 0a 09 09 54 63 6c 5f 42 61 63  N < 6)...Tcl_Bac
1e30: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
1e40: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63  erp);.#else...Tc
1e50: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
1e60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
1e70: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 6f 6b  de);.#endif...ok
1e80: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a   = 0;..    }..}.
1e90: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
1ea0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
1eb0: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  r);..    statePt
1ec0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c  r->flags &= ~(TL
1ed0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b  S_TCL_CALLBACK);
1ee0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
1ef0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
1f00: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63  tatePtr);.    Tc
1f10: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
1f20: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
1f30: 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09      return(ok);.
1f40: 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c  /* By default, l
1f50: 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f  eave verificatio
1f60: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a  n unchanged..*/.
1f70: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
1fc0: 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a   * Tls_Error --.
1fd0: 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c   *. *.Calls call
1fe0: 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 61 6e  back with $fd an
1ff0: 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65 20  d $msg - so the 
2000: 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 63  callback can dec
2010: 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20 64  ide. *.what to d
2020: 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a 20  o with errors.. 
2030: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2040: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69  s:. *.The err fi
2050: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
2060: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53  ntly operative S
2070: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20  tate is set. *. 
2080: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73   to a string des
2090: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20  cribing the SSL 
20a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c  negotiation fail
20b0: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d  ure reason. *---
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
2110: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
2120: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
2130: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
2140: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
2150: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
2160: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
2170: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  ;.    int code;.
2180: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
2190: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
21a0: 28 6d 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a  (msg && *msg) {.
21b0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
21c0: 65 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c  e(interp, "SSL",
21d0: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55   msg, (char *)NU
21e0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LL);.    } else 
21f0: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74  {..msg = Tcl_Get
2200: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
2210: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
2220: 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20  nterp), NULL);. 
2230: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
2240: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20  r->err = msg;.. 
2250: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
2260: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
2270: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
2280: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
2290: 3b 0a 09 73 70 72 69 6e 74 66 28 62 75 66 2c 20  ;..sprintf(buf, 
22a0: 22 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25  "SSL channel \"%
22b0: 73 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c  s\": error: %s",
22c0: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ..    Tcl_GetCha
22d0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
22e0: 72 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a  r->self), msg);.
22f0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
2300: 6e 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f  nterp, buf, TCL_
2310: 56 4f 4c 41 54 49 4c 45 29 3b 0a 23 69 66 20 28  VOLATILE);.#if (
2320: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
2330: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
2340: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
2350: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
2360: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
2370: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
2380: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
2390: 69 6e 74 65 72 70 2c 20 54 43 4c 5f 45 52 52 4f  interp, TCL_ERRO
23a0: 52 29 3b 0a 23 65 6e 64 69 66 0a 09 72 65 74 75  R);.#endif..retu
23b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d  rn;.    }.    cm
23c0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
23d0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
23e0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20  ->callback);..  
23f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2400: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2410: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2420: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72  ewStringObj("err
2430: 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  or", -1));.    T
2440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2460: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
2470: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
2480: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
2490: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
24a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
24b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
24c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
24d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
24e0: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b  ngObj(msg, -1));
24f0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
2500: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
2510: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
2520: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
2530: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2540: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
2550: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2560: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
2570: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
2580: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
2590: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
25a0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
25b0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d  OK) {.#if (TCL_M
25c0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20  AJOR_VERSION == 
25d0: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52  8) && (TCL_MINOR
25e0: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54  _VERSION < 6)..T
25f0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
2600: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73  or(interp);.#els
2610: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  e..Tcl_Backgroun
2620: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
2630: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
2640: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
2650: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
2660: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
2670: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
2680: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
2690: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
26a0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
26b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2700: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c   *. * KeyLogCall
2710: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72  back --. *. *.Wr
2720: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79  ite received key
2730: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c   data to log fil
2740: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
2750: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  fects:. *.none. 
2760: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65  ----. */.void Ke
27b0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  yLogCallback(con
27c0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  st SSL *ssl, con
27d0: 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b  st char *line) {
27e0: 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d  .    char *str =
27f0: 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f   getenv(SSLKEYLO
2800: 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45  GFILE);.    FILE
2810: 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28 73 74   *fd;.    if (st
2820: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e  r) {..fd = fopen
2830: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72  (str, "a");..fpr
2840: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c  intf(fd, "%s\n",
2850: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66  line);..fclose(f
2860: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  d);.    }.}.../*
2870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73  ------. *. * Pas
28c0: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d  sword Callback -
28d0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
28e0: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69  hen a password i
28f0: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61  s needed to unpa
2900: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b  ck RSA and PEM k
2910: 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e  eys.. *.Evals an
2920: 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 64  y bound password
2930: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75   script and retu
2940: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61  rns the result a
2950: 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f 72  s. *.the passwor
2960: 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d  d string.. *----
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
29b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50   */.static int.P
29c0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
29d0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
29e0: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c  ize, int verify,
29f0: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a   void *udata) {.
2a00: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
2a10: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
2a20: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
2a30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
2a40: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2a50: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
2a60: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
2a70: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ode;..    dprint
2a80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
2a90: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
2aa0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
2ab0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
2ac0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
2ad0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
2ae0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
2af0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
2b00: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
2b10: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
2b20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
2b30: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63  erp);..    strnc
2b40: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
2b50: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20  ze_t) size);..  
2b60: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74    return (int)st
2b70: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c  rlen(ret);..} el
2b80: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
2b90: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20   -1;..}.    }.. 
2ba0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
2bb0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
2bc0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
2bd0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
2be0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
2bf0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
2c00: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
2c10: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
2c20: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  );..    Tcl_Incr
2c30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2c40: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
2c50: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
2c60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
2c70: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
2c80: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c   if (code != TCL
2c90: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f  _OK) {.#if (TCL_
2ca0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
2cb0: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
2cc0: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
2cd0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
2ce0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
2cf0: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
2d00: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
2d10: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69  rp, code);.#endi
2d20: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  f.    }.    Tcl_
2d30: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2d40: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  Ptr);..    Tcl_R
2d50: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
2d60: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
2d70: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
2d80: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20  TCL_OK) {..char 
2d90: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
2da0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
2db0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66  ult(interp);..if
2dc0: 20 28 73 74 72 6c 65 6e 28 72 65 74 29 20 3c 20   (strlen(ret) < 
2dd0: 73 69 7a 65 20 2d 20 31 29 20 7b 0a 09 20 20 20  size - 1) {..   
2de0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65   strncpy(buf, re
2df0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65  t, (size_t) size
2e00: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
2e10: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
2e20: 20 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 72   interp);..    r
2e30: 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65  eturn (int)strle
2e40: 6e 28 72 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d  n(ret);..}.    }
2e50: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
2e60: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
2e70: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72  terp);.    retur
2e80: 6e 20 2d 31 3b 0a 09 76 65 72 69 66 79 20 3d 20  n -1;..verify = 
2e90: 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  verify;.}.../*. 
2ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69  ----. *. * Sessi
2ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  on Callback for 
2f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
2f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e  .Called when a n
2f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64  ew session is ad
2f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65  ded to the cache
2f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09  . In TLS 1.3. *.
2f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65  this may be rece
2f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ived multiple ti
2f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61  mes after the ha
2f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09  ndshake. For. *.
2f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  earlier versions
2fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72  , this will be r
2fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74  eceived during t
2fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  he handshake.. *
2fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65  .This is the pre
2fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62  ferred way to ob
2ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65  tain a resumable
3000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20   session.. *. * 
3010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
3020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
3040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
3050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
3060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65   codes:. *.0 = e
3070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69  rror where sessi
3080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64  on will be immed
3090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66  iately removed f
30a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
30b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73   cache.. *.1 = s
30c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70  uccess where app
30d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e   retains session
30e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68   in session cach
30f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c  e, and must call
3100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65   SSL_SESSION_fre
3110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20  e() when done.. 
3120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61  ic int.SessionCa
3180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
31a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
31b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
31c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
31d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
31e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
31f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
3210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
3220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
3230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
3250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
3270: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3280: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a     size_t len2;.
3290: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
32a0: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69   ulen;..    dpri
32b0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
32c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
32d0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
32e0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
32f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
3300: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
3310: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
3320: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3330: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
3340: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
3350: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
3360: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3370: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3380: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3390: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
33a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
33b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
33c0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
33d0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
33e0: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
33f0: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
3400: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
3410: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
3420: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3430: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3440: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
3450: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
3460: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c  ion_id, (int) ul
3470: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
3480: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
3490: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
34a0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
34b0: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
34c0: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
34d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
34e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
34f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
3500: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
3510: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  int) len2));..  
3520: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
3530: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
3540: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
3550: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3560: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3570: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
3580: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
3590: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
35a0: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
35b0: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54  ssion)));..    T
35c0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
35d0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
35e0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
35f0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3600: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3610: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3620: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3630: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3640: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3650: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3660: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3670: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3680: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3690: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
36a0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
36b0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
36c0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
36d0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
36e0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
36f0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3700: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3730: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3740: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3750: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
3760: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3770: 74 61 29 20 69 6e 74 65 72 70 29 3b 20 20 20 20  ta) interp);    
3780: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a  return 0;.}.../*
3790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50  ------. *. * ALP
37e0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  N Callback for S
37f0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
3800: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73  Perform server-s
3810: 69 64 65 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74  ide protocol (ht
3820: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
3830: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20  etc.) selection 
3840: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d  for the. *.incom
3850: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ing connection. 
3860: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c  Called after Hel
3870: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61  lo and server ca
3880: 6c 6c 62 61 63 6b 73 0a 20 2a 0a 20 2a 20 52 65  llbacks. *. * Re
3890: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
38a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
38b0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
38c0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
38d0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
38e0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
38f0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e  EXT_ERR_OK: ALPN
3900: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
3910: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
3920: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
3930: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
3940: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65  ALERT_FATAL: The
3950: 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61  re was no overla
3960: 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c  p between the cl
3970: 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75  ient's. *.    su
3980: 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20  pplied list and 
3990: 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69  the server confi
39a0: 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f  guration. The co
39b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nnection will be
39c0: 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c   aborted.. *.SSL
39d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
39e0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  K: ALPN protocol
39f0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65   not selected, e
3a00: 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20  .g., because no 
3a10: 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74  ALPN. *.    prot
3a20: 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67  ocols are config
3a30: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f  ured for this co
3a40: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f  nnection. The co
3a50: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
3a60: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3ab0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e  .static int.ALPN
3ac0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
3ad0: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75  SL *ssl, const u
3ae0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f  nsigned char **o
3af0: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ut, unsigned cha
3b00: 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73  r *outlen,..cons
3b10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3b20: 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  *in, unsigned in
3b30: 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  t inlen, void *a
3b40: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
3b50: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
3b60: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
3b70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
3b80: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
3b90: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
3ba0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
3bb0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20   code, res;..   
3bc0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3bd0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3be0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3bf0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
3c00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
3c10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
3c20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
3c30: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
3c40: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
3c50: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
3c60: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
3c70: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
3c80: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
3c90: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20  next_proto(out, 
3ca0: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
3cb0: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
3cc0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
3cd0: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
3ce0: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
3cf0: 49 41 54 45 44 29 20 7b 0a 09 72 65 73 20 3d 20  IATED) {..res = 
3d00: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
3d10: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
3d20: 09 2f 2a 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20  ./* No overlap, 
3d30: 73 6f 20 66 69 72 73 74 20 63 6c 69 65 6e 74 20  so first client 
3d40: 70 72 6f 74 6f 63 6f 6c 20 75 73 65 64 20 2a 2f  protocol used */
3d50: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
3d60: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
3d70: 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20    }..    cmdPtr 
3d80: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
3d90: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
3da0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
3db0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3dc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3dd0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3de0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
3df0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3e10: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3e20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3e30: 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 0a 20  j(*out, -1));.. 
3e40: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
3e50: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3e60: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
3e70: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
3e80: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
3e90: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
3ea0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
3eb0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61    code = Tcl_Eva
3ec0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63  lObjEx(interp, c
3ed0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f  mdPtr, TCL_EVAL_
3ee0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20  GLOBAL);.    if 
3ef0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29  (code != TCL_OK)
3f00: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f   {.#if (TCL_MAJO
3f10: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20  R_VERSION == 8) 
3f20: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45  && (TCL_MINOR_VE
3f30: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f  RSION < 6)..Tcl_
3f40: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
3f50: 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09  interp);.#else..
3f60: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78  Tcl_BackgroundEx
3f70: 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  ception(interp, 
3f80: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  code);.#endif.  
3f90: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
3fa0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3fb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  ;..    Tcl_Relea
3fc0: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3fd0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
3fe0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3ff0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
4000: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
4010: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4060: 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b  . * SNI Callback
4070: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a   for Servers --.
4080: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65   *. *.Perform se
4090: 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f  rver-side SNI ho
40a0: 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e  stname selection
40b0: 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67   after receiving
40c0: 20 53 4e 49 20 68 65 61 64 65 72 2e 0a 20 2a 09   SNI header.. *.
40d0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c  Called after hel
40e0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20  lo callback but 
40f0: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c  before ALPN call
4100: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  back.. *. * Resu
4110: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4120: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4130: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4140: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4150: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4160: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4170: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f  T_ERR_OK: SNI ho
4180: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74  stname is accept
4190: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
41a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
41b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
41c0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49  ALERT_FATAL: SNI
41d0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
41e0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
41f0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20  onnection. *.   
4200: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66   is aborted. Def
4210: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69  ault for alert i
4220: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  s SSL_AD_UNRECOG
4230: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53  NIZED_NAME.. *.S
4240: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4250: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49  ERT_WARNING: SNI
4260: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
4270: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69   accepted, warni
4280: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20  ng alert. *.    
4290: 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c 53  sent (not in TLS
42a0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65  v1.3). The conne
42b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
42c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
42d0: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f  RR_NOACK: SNI ho
42e0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
42f0: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61  cepted and not a
4300: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09  cknowledged,. *.
4310: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20      e.g. if SNI 
4320: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e  has not been con
4330: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e  figured. The con
4340: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4350: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
43a0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61  static int.SNICa
43b0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
43c0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
43d0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
43e0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
43f0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
4400: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
4410: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4420: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4440: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b  r;.    int code;
4450: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
4460: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
4470: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4480: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4490: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
44a0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
44b0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
44c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
44d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
44e0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
44f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4500: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4510: 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 6e    }..    servern
4520: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ame = SSL_get_se
4530: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
4540: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
4550: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  st_name);.    if
4560: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c   (!servername ||
4570: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d   servername[0] =
4580: 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 20  = '\0') {.      
4590: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53    return SSL_TLS
45a0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
45b0: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72     }..    cmdPtr
45c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
45d0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
45e0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
45f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4600: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4610: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
4620: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31  ingObj("sni", -1
4630: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4640: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4650: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4660: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4670: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
4680: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  1));..    Tcl_Pr
4690: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
46a0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
46b0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
46c0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
46d0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
46e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
46f0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
4700: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
4710: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
4720: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
4730: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
4740: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
4750: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
4760: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
4770: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
4780: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
4790: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
47a0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
47b0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
47c0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
47d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
47e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
47f0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
4800: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
4810: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
4820: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
4830: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
4840: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
4850: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4860: 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  R_OK;.}.../*. *-
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 48  --. *. * Hello H
48c0: 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63  andshake Callbac
48d0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d  k for Servers --
48e0: 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73  . *. *.Used by s
48f0: 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65  erver to examine
4900: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65   the server name
4910: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49   indication (SNI
4920: 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70  ) extension. *.p
4930: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63  rovided by the c
4940: 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  lient in order t
4950: 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72  o select an appr
4960: 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63  opriate certific
4970: 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e  ate to. *.presen
4980: 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65  t, and make othe
4990: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  r configuration 
49a0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65  adjustments rele
49b0: 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72  vant to that ser
49c0: 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20  ver. *.name and 
49d0: 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  its configuratio
49e0: 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  n. This includes
49f0: 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68   swapping out th
4a00: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09  e associated. *.
4a10: 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c  SSL_CTX pointer,
4a20: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73   modifying the s
4a30: 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20  erver's list of 
4a40: 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65  permitted TLS ve
4a50: 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67  rsions,. *.chang
4a60: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
4a70: 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20   cipher list in 
4a80: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20  response to the 
4a90: 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20  client's cipher 
4aa0: 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a  list, etc.. *. *
4ab0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4ac0: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4ad0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4ae0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4af0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4b00: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4b10: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54  CLIENT_HELLO_RET
4b20: 52 59 20 3d 20 73 75 73 70 65 6e 64 20 74 68 65  RY = suspend the
4b30: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20   handshake, and 
4b40: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75  the handshake fu
4b50: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
4b60: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  rn immediately. 
4b70: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
4b80: 4c 4f 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c 75  LO_ERROR = failu
4b90: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
4ba0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
4bb0: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
4bc0: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
4bd0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 3d  _HELLO_SUCCESS =
4be0: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d   success. *. *--
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
4c40: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63  .HelloCallback(c
4c50: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
4c60: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
4c70: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4c80: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4c90: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4ca0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4cb0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4cc0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4cd0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4ce0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
4cf0: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e  st char *servern
4d00: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ame;.    const u
4d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b  nsigned char *p;
4d20: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c  .    size_t len,
4d30: 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20   remaining;..   
4d40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
4d50: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
4d60: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
4d70: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
4d80: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4d90: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
4da0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
4db0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c  e if (ssl == NUL
4dc0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4dd0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
4de0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
4df0: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a  /* Get names */.
4e00: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69      if (!SSL_cli
4e10: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65  ent_hello_get0_e
4e20: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54  xt(ssl, TLSEXT_T
4e30: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c  YPE_server_name,
4e40: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29   &p, &remaining)
4e50: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d   || remaining <=
4e60: 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65   2) {.        re
4e70: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
4e80: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
4e90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
4ea0: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
4eb0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
4ec0: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
4ed0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
4ee0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
4ef0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
4f00: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
4f10: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20  emaining) {.    
4f20: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43      return SSL_C
4f30: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
4f40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
4f50: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20  aining = len;.. 
4f60: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
4f70: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20  n practice only 
4f80: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  has a single ele
4f90: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79  ment, so we only
4fa0: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69   consider the fi
4fb0: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  rst one. */.    
4fc0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  if (remaining ==
4fd0: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c   0 || *p++ != TL
4fe0: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
4ff0: 73 74 5f 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20  st_name) {.     
5000: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c     return SSL_CL
5010: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
5020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
5030: 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a  ining--;..    /*
5040: 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61   Now we can fina
5050: 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65  lly pull out the
5060: 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68   byte array with
5070: 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74   the actual host
5080: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20  name. */.    if 
5090: 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29  (remaining <= 2)
50a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
50b0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
50c0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
50d0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
50e0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
50f0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
5100: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65  if (len + 2 > re
5110: 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20  maining) {.     
5120: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c     return SSL_CL
5130: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
5140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
5150: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20  ining = len;.   
5160: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63   servername = (c
5170: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a  onst char *)p;..
5180: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
5190: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
51a0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
51b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
51c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
51e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
51f0: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a  ("hello", -1));.
5200: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5210: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5220: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
5240: 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20  rvername, (int) 
5250: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  len));..    Tcl_
5260: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
5270: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
5280: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
5290: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
52a0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  tePtr);..    Tcl
52b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
52c0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
52d0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
52e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
52f0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
5300: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
5310: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
5320: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
5330: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
5340: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
5350: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
5360: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
5370: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
5380: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
5390: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
53a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
53b0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
53c0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
53d0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
53e0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
53f0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
5400: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
5410: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65   interp);.    re
5420: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
5430: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 7d  HELLO_SUCCESS;.}
5440: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d  ********/./* Com
5460: 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f  mands         */
5470: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
5480: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54d0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f  -. *. * CiphersO
54e0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
54f0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a  ailable ciphers.
5500: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
5510: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
5520: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
5530: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f  tls::ciphers" co
5540: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
5550: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
5560: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70  rs, based upon p
5570: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
5580: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5590: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
55a0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
55b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
55c0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
55d0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53  s and destroys S
55e0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
55f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
5640: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5650: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b  *protocols[] = {
5660: 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22  .."ssl2", "ssl3"
5670: 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e  , "tls1", "tls1.
5680: 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74  1", "tls1.2", "t
5690: 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a  ls1.3", NULL.};.
56a0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a  enum protocol {.
56b0: 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c      TLS_SSL2, TL
56c0: 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31  S_SSL3, TLS_TLS1
56d0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c  , TLS_TLS1_1, TL
56e0: 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c  S_TLS1_2, TLS_TL
56f0: 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d  S1_3, TLS_NONE.}
5700: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69  ;..static int.Ci
5710: 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65  phersObjCmd(Clie
5720: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
5730: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
5740: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
5750: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
5760: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
5770: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20  l_Obj *objPtr = 
5780: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54  NULL;.    SSL_CT
5790: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
57a0: 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55     SSL *ssl = NU
57b0: 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46  LL;.    STACK_OF
57c0: 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b  (SSL_CIPHER) *sk
57d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20  ;.    char *cp, 
57e0: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20  buf[BUFSIZ];.   
57f0: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62   int index, verb
5800: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70  ose = 0, use_sup
5810: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20  ported = 0;..   
5820: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
5830: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62  ");..    if ((ob
5840: 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63  jc < 2) || (objc
5850: 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72   > 4)) {..Tcl_Wr
5860: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5870: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f  p, 1, objv, "pro
5880: 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20  tocol ?verbose? 
5890: 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09  ?supported?");..
58a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
58b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
58c0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
58d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
58e0: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20  [1], protocols, 
58f0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26  "protocol", 0, &
5900: 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b  index) != TCL_OK
5910: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5920: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
5930: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20   if ((objc > 2) 
5940: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
5950: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
5960: 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f   objv[2], &verbo
5970: 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  se) != TCL_OK) {
5980: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5990: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
59a0: 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20   ((objc > 3) && 
59b0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
59c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
59d0: 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70  jv[3], &use_supp
59e0: 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b  orted) != TCL_OK
59f0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5a00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
5a10: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
5a20: 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68  r();..    switch
5a30: 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c   ((enum protocol
5a40: 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20  )index) {..case 
5a50: 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50  TLS_SSL2:.#if OP
5a60: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
5a70: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30  MBER >= 0x101000
5a80: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e  00L || defined(N
5a90: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e  O_SSL2) || defin
5aa0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
5ab0: 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  L2)..    Tcl_App
5ac0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5ad0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
5ae0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
5af0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
5b00: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
5b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
5b20: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53  lse..    ctx = S
5b30: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32  SL_CTX_new(SSLv2
5b40: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61  _method()); brea
5b50: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
5b60: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65  TLS_SSL3:.#if de
5b70: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
5b80: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
5b90: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  L_NO_SSL3) || de
5ba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
5bb0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20  _SSL3_METHOD).. 
5bc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5bd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
5be0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
5bf0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
5c00: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
5c10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
5c20: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
5c30: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
5c40: 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f  _new(SSLv3_metho
5c50: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  d()); break;.#en
5c60: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
5c70: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
5c80: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
5c90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
5ca0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
5cb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
5cc0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
5cd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5ce0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
5cf0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
5d00: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
5d10: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
5d20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5d30: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
5d40: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54   = SSL_CTX_new(T
5d50: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20  LSv1_method()); 
5d60: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
5d70: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a  ase TLS_TLS1_1:.
5d80: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
5d90: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
5da0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
5db0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
5dc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
5dd0: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
5de0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5df0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
5e00: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
5e10: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
5e20: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
5e30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5e40: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63  OR;.#else..    c
5e50: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
5e60: 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28  (TLSv1_1_method(
5e70: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  )); break;.#endi
5e80: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
5e90: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
5ea0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
5eb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
5ec0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
5ed0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
5ee0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
5ef0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5f00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
5f10: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
5f20: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
5f30: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
5f40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
5f50: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
5f60: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
5f70: 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74  _new(TLSv1_2_met
5f80: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
5f90: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
5fa0: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69  TLS1_3:.#if defi
5fb0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
5fc0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
5fd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20  L_NO_TLS1_3)..  
5fe0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5ff0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
6000: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
6010: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
6020: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
6030: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6040: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
6050: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
6060: 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29  new(TLS_method()
6070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
6080: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
6090: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
60a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
60b0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
60c0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
60d0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
60e0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20  3_VERSION);..   
60f0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
6100: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72  default:..    br
6110: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
6120: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20  f (ctx == NULL) 
6130: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
6140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
6150: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
6160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6170: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d      }..    ssl =
6180: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
6190: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
61a0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
61b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
61c0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
61d0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
61e0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tx);..return TCL
61f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6200: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61     /* Use list a
6210: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c  nd order as woul
6220: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43  d be sent in a C
6230: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c  lientHello or al
6240: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  l available ciph
6250: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75  ers */.    if (u
6260: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
6270: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73  .sk = SSL_get1_s
6280: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73  upported_ciphers
6290: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (ssl);.    } els
62a0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  e {..sk = SSL_ge
62b0: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  t_ciphers(ssl);.
62c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
62d0: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  k != NULL) {..if
62e0: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20   (!verbose) {.. 
62f0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
6300: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
6310: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
6320: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
6330: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
6340: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
6350: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
6360: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
6370: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
6380: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
6390: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
63a0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
63b0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
63c0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
63d0: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
63e0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
63f0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
6400: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6410: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
6420: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
6430: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
6440: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
6450: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
6460: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
6470: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
6480: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
6490: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
64a0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
64b0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
64c0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
64d0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
64e0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
64f0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
6500: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
6510: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
6520: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
6530: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
6540: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
6550: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
6560: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
6570: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
6580: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75   (int) strlen(bu
6590: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  f));...} else {.
65a0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
65b0: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55  ToObj(objPtr, "U
65c0: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09  NKNOWN\n", 8);..
65d0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  .}..    }..}..if
65e0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
65f0: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43   {..    sk_SSL_C
6600: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a  IPHER_free(sk);.
6610: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  .}.    }.    SSL
6620: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20  _free(ssl);.    
6630: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
6640: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
6650: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
6660: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
6670: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
6680: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
6690: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63  ---. *. * Protoc
66f0: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  olsObjCmd -- lis
6700: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74  t available prot
6710: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73  ocols. *. *.This
6720: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
6730: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
6740: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f   the "tls::proto
6750: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  cols" command. *
6760: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
6770: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  le protocols.. *
6780: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
6790: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
67a0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
67b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
67c0: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
6820: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
6830: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6840: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6850: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6860: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
6870: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
6880: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
6890: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
68a0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
68b0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b  if (objc != 1) {
68c0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
68d0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
68e0: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e  jv, "");..return
68f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6900: 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  }..    objPtr = 
6910: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
6920: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50  , NULL);..#if OP
6930: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
6940: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
6950: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
6960: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
6970: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
6980: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  SL2).    Tcl_Lis
6990: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
69a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
69b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
69c0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
69d0: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL2], -1));.#e
69e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
69f0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
6a00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6a10: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f  O_SSL3).    Tcl_
6a20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6a30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
6a40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
6a50: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
6a60: 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b  TLS_SSL3], -1));
6a70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
6a80: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
6a90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
6aa0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54  L_NO_TLS1).    T
6ab0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6ac0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6ad0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
6ae0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
6af0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31  ls[TLS_TLS1], -1
6b00: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
6b10: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
6b20: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
6b30: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
6b40: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
6b50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6b60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
6b70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6b80: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
6b90: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_1], -1));.#en
6ba0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
6bb0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
6bc0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
6bd0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 54  NO_TLS1_2).    T
6be0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6bf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6c00: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
6c10: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
6c20: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20  ls[TLS_TLS1_2], 
6c30: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
6c40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
6c50: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
6c60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
6c70: 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  _3).    Tcl_List
6c80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6c90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
6ca0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6cb0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
6cc0: 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_3], -1));.#
6cd0: 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53  endif..    Tcl_S
6ce0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6cf0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
6d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6d10: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
6d20: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
6d30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e  ------. *. * Han
6d80: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a  dshakeObjCmd --.
6d90: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61   *. *.This comma
6da0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  nd is used to ve
6db0: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65  rify whether the
6dc0: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f   handshake is co
6dd0: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74  mplete. *.or not
6de0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6df0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
6e00: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61  cl result. 1 mea
6e10: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d  ns handshake com
6e20: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70  plete, 0 means p
6e30: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69  ending.. *. * Si
6e40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
6e50: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67  ay force SSL neg
6e60: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65  otiation to take
6e70: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d   place.. *. *---
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
6ed0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28  HandshakeObjCmd(
6ee0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6ef0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6f00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6f10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
6f20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
6f30: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
6f40: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an;        /* Th
6f50: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
6f60: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
6f70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
6f80: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c  tr;        /* cl
6f90: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
6fa0: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
6fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72   const char *err
6fc0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Str = NULL;.    
6fd0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20  int ret = 1;.   
6fe0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20   int err = 0;.. 
6ff0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7000: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
7010: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
7020: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7030: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
7040: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
7050: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
7060: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
7070: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
7080: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
7090: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
70a0: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
70b0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
70c0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
70d0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
70e0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
70f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
7100: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
7110: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
7120: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
7130: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
7140: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
7150: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
7160: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
7170: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
7180: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
7190: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
71a0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
71b0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
71c0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c  elName(chan), "\
71d0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
71e0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  nnel", NULL);..r
71f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
7200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
7210: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
7220: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
7230: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
7240: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
7250: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
7260: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20  ForConnect");.  
7270: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74    ret = Tls_Wait
7280: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
7290: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20  Ptr, &err, 1);. 
72a0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f     dprintf("Tls_
72b0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72  WaitForConnect r
72c0: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65  eturned: %i", re
72d0: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74  t);..    if (ret
72e0: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50   < 0 && ((stateP
72f0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
7300: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65  TCL_ASYNC) && (e
7310: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20  rr == EAGAIN))) 
7320: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e  {..dprintf("Asyn
7330: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20  c set and err = 
7340: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d  EAGAIN");..ret =
7350: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   0;.    } else i
7360: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65  f (ret < 0) {..e
7370: 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72  rrStr = statePtr
7380: 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65  ->err;..Tcl_Rese
7390: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
73a0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65  ..Tcl_SetErrno(e
73b0: 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53  rr);...if (!errS
73c0: 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d  tr || (*errStr =
73d0: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72  = 0)) {..    err
73e0: 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45  Str = Tcl_PosixE
73f0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d  rror(interp);..}
7400: 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
7410: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e  ult(interp, "han
7420: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22  dshake failed: "
7430: 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20  , errStr, (char 
7440: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e  *) NULL);..dprin
7450: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43  tf("Returning TC
7460: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e  L_ERROR with han
7470: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25  dshake failed: %
7480: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65  s", errStr);..re
7490: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
74a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
74b0: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09  f (err != 0) {..
74c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
74d0: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61   an error with a
74e0: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73   completed hands
74f0: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c  hake: err = %i",
7500: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d   err);..}..ret =
7510: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   1;.    }..    d
7520: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
7530: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61  g TCL_OK with da
7540: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29  ta \"%i\"", ret)
7550: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
7560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
7570: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74  cl_NewIntObj(ret
7580: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54  ));.    return(T
7590: 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44  CL_OK);..clientD
75a0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
75b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7600: 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  . * ImportObjCmd
7610: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
7620: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
7630: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
7640: 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64  he "ssl" command
7650: 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63  . *. *.The ssl c
7660: 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53  ommand pushes SS
7670: 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20  L over a (newly 
7680: 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73  connected) tcp s
7690: 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75  ocket. *. * Resu
76a0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
76b0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
76c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
76d0: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
76e0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
76f0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
7700: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
7750: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62  tic int.ImportOb
7760: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
7770: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
7780: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7790: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
77a0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
77b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
77c0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
77d0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
77e0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
77f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
7800: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
7810: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
7820: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  et */.    SSL_CT
7830: 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d  X *ctx.        =
7840: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
7850: 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20  bj *script.     
7860: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
7870: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64  cl_Obj *password
7880: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7890: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
78a0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61   upperChannelTra
78b0: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43  nslation, upperC
78c0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20  hannelBlocking, 
78d0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
78e0: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  ding, upperChann
78f0: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69  elEOFChar;.    i
7900: 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20  nt idx, len;.   
7910: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20   int flags..    
7920: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e      = TLS_TCL_IN
7930: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76  IT;.    int serv
7940: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b  er..        = 0;
7950: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f  ./* is connectio
7960: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75  n incoming or ou
7970: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63  tgoing? */.    c
7980: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20  har *keyfile.   
7990: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
79a0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09   char *certfile.
79b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
79c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
79d0: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b  r *key  .= NULL;
79e0: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  .    int key_len
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e   = 0;.    unsign
7a10: 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20  ed char *cert   
7a20: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7a30: 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20    int cert_len  
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
7a50: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  0;.    char *cip
7a60: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
7a70: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
7a80: 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20  iphersuites.    
7a90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7aa0: 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20  char *CAfile.   
7ab0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
7ac0: 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20   char *CAdir..  
7ad0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7ae0: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73    char *DHparams
7af0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7b00: 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c  .    char *model
7b10: 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  ..        = NULL
7b20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76  ;.    char *serv
7b30: 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d  ername.        =
7b40: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61   NULL;./* hostna
7b50: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61  me for Server Na
7b60: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f  me Indication */
7b70: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
7b80: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
7b90: 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  n_id = NULL;.   
7ba0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09   Tcl_Obj *alpn..
7bb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
7bc0: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
7bd0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
7be0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
7bf0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
7c00: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
7c10: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
7c20: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
7c30: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
7c40: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
7c50: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
7c60: 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20  shake = 0;..    
7c70: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
7c80: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  );..#if OPENSSL_
7c90: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
7ca0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
7cb0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
7cc0: 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  _NO_SSL2) && !de
7cd0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
7ce0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  & defined(NO_SSL
7cf0: 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  3) && defined(NO
7d00: 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65  _TLS1) && define
7d10: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
7d20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7d30: 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  2) && defined(NO
7d40: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c  _TLS1_3).    ssl
7d50: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 1;.#endif.#i
7d60: 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  f !defined(OPENS
7d70: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
7d80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
7d90: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   && defined(NO_S
7da0: 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 28  SL2) && defined(
7db0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69  NO_TLS1) && defi
7dc0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
7dd0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  & defined(NO_TLS
7de0: 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28  1_2) && defined(
7df0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73  NO_TLS1_3).    s
7e00: 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  sl3 = 1;.#endif.
7e10: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7e20: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
7e30: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
7e40: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23  .    tls1 = 0;.#
7e50: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
7e60: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
7e70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7e80: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74  NO_TLS1_1).    t
7e90: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_1 = 0;.#endi
7ea0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
7eb0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7ec0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7ed0: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_2).    tls1_
7ee0: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 0;.#endif.#i
7ef0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
7f00: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
7f10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7f20: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20  3).    tls1_3 = 
7f30: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  0;.#endif..    i
7f40: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
7f50: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7f60: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7f70: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69  , "channel ?opti
7f80: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ons?");..return 
7f90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7fa0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
7fb0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
7fc0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
7fd0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
7fe0: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  , NULL), NULL);.
7ff0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
8000: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
8010: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
8020: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8030: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
8040: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
8050: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
8060: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
8070: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
8080: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
8090: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
80a0: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
80b0: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54  {..char *opt = T
80c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
80d0: 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e  Obj(objv[idx], N
80e0: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b  ULL);...if (opt[
80f0: 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20  0] != '-')..    
8100: 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28  break;...OPTSTR(
8110: 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29  "-cadir", CAdir)
8120: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69  ;..OPTSTR("-cafi
8130: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f  le", CAfile);..O
8140: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65  PTSTR("-certfile
8150: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f  ", certfile);..O
8160: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c  PTSTR("-cipher",
8170: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
8180: 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63  TR("-ciphers", c
8190: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
81a0: 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22  ("-ciphersuites"
81b0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b  , ciphersuites);
81c0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61  ..OPTOBJ("-comma
81d0: 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f  nd", script);..O
81e0: 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73  PTSTR("-dhparams
81f0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f  ", DHparams);..O
8200: 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22  PTSTR("-keyfile"
8210: 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54  , keyfile);..OPT
8220: 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f  STR("-model", mo
8230: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  del);..OPTOBJ("-
8240: 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77  password", passw
8250: 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ord);..OPTBOOL("
8260: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22  -post_handshake"
8270: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
8280: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
8290: 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29  quire", require)
82a0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71  ;..OPTBOOL("-req
82b0: 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b  uest", request);
82c0: 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72  ..OPTINT("-secur
82d0: 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c  itylevel", level
82e0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65  );..OPTBOOL("-se
82f0: 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a  rver", server);.
8300: 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72  .OPTSTR("-server
8310: 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d  name", servernam
8320: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65  e);..OPTSTR("-se
8330: 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
8340: 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 4f 42 4a 28  on_id);..OPTOBJ(
8350: 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a  "-alpn", alpn);.
8360: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22  .OPTBOOL("-ssl2"
8370: 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl2);..OPTBOO
8380: 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29  L("-ssl3", ssl3)
8390: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
83a0: 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42  1", tls1);..OPTB
83b0: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74  OOL("-tls1.1", t
83c0: 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c  ls1_1);..OPTBOOL
83d0: 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31  ("-tls1.2", tls1
83e0: 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _2);..OPTBOOL("-
83f0: 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29  tls1.3", tls1_3)
8400: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72  ;..OPTBYTE("-cer
8410: 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c  t", cert, cert_l
8420: 65 6e 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  en);..OPTBYTE("-
8430: 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c  key", key, key_l
8440: 65 6e 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f  en);...OPTBAD("o
8450: 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20  ption", "-alpn, 
8460: 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c  -cadir, -cafile,
8470: 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c   -cert, -certfil
8480: 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70  e, -cipher, -cip
8490: 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d  hersuites, -comm
84a0: 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20  and, -dhparams, 
84b0: 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20  -key, -keyfile, 
84c0: 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72  -model, -passwor
84d0: 64 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 72 65  d, -require, -re
84e0: 71 75 65 73 74 2c 20 2d 73 65 63 75 72 69 74 79  quest, -security
84f0: 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20  level, -server, 
8500: 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65  -servername, -se
8510: 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c  ssion_id, -ssl2,
8520: 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d   -ssl3, -tls1, -
8530: 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c  tls1.1, -tls1.2,
8540: 20 6f 72 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a   or -tls1.3");..
8550: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8560: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
8570: 28 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65  (request).    ve
8580: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
8590: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c  FY_CLIENT_ONCE |
85a0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
85b0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  ;.    if (reques
85c0: 74 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65  t && require) ve
85d0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
85e0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
85f0: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20  ER_CERT;.    if 
8600: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
8610: 5f 68 61 6e 64 73 68 61 6b 65 29 20 20 76 65 72  _handshake)  ver
8620: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
8630: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
8640: 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79  ;.    if (verify
8650: 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20   == 0).verify = 
8660: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b  SSL_VERIFY_NONE;
8670: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ..    proto |= (
8680: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl2 ? TLS_PROTO
8690: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL2 : 0);.    
86a0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f  proto |= (ssl3 ?
86b0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20   TLS_PROTO_SSL3 
86c0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
86d0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50  |= (tls1 ? TLS_P
86e0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a  ROTO_TLS1 : 0);.
86f0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
8700: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_1 ? TLS_PROTO
8710: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20  _TLS1_1 : 0);.  
8720: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
8730: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _2 ? TLS_PROTO_T
8740: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_2 : 0);.    
8750: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33  proto |= (tls1_3
8760: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8770: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  1_3 : 0);..    /
8780: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
8790: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20  if blank string 
87a0: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20  provided */.    
87b0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65  if (cert && !*ce
87c0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72  rt)..        cer
87d0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t.        = NULL
87e0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26  ;.    if (key &&
87f0: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20   !*key)..       
8800: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e   key.        = N
8810: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72  ULL;.    if (cer
8820: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66  tfile && !*certf
8830: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72  ile)         cer
8840: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20  tfile.= NULL;.  
8850: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26    if (keyfile &&
8860: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79   !*keyfile)..key
8870: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
8880: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
8890: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
88a0: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65  s).        ciphe
88b0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rs.        = NUL
88c0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
88d0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70  rsuites && !*cip
88e0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65  hersuites) ciphe
88f0: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c  rsuites    = NUL
8900: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  L;.    if (CAfil
8910: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20  e && !*CAfile). 
8920: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20         CAfile.  
8930: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8940: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21    if (CAdir && !
8950: 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20  *CAdir).        
8960: 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20  CAdir.        = 
8970: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48  NULL;.    if (DH
8980: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61  params && !*DHpa
8990: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48  rams).        DH
89a0: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20  params        = 
89b0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
89c0: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
89d0: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
89e0: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  State *) ckalloc
89f0: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65  ((unsigned) size
8a00: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20  of(State));.    
8a10: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c  memset(statePtr,
8a20: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65   0, sizeof(State
8a30: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  ));..    statePt
8a40: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73  r->flags.= flags
8a50: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
8a60: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b  interp.= interp;
8a70: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
8a80: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a  flags.= verify;.
8a90: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
8aa0: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20  r.= "";..    /* 
8ab0: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20  allocate script 
8ac0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70  */.    if (scrip
8ad0: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  t) {..(void) Tcl
8ae0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8af0: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b  j(script, &len);
8b00: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
8b10: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c    statePtr->call
8b20: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09  back = script;..
8b30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
8b40: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
8b50: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20  allback);..}.   
8b60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
8b70: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a  ate password */.
8b80: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64      if (password
8b90: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
8ba0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8bb0: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29  (password, &len)
8bc0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
8bd0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73     statePtr->pas
8be0: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64  sword = password
8bf0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
8c00: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
8c10: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a  ->password);..}.
8c20: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d      }..    if (m
8c30: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  odel != NULL) {.
8c40: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47  .int mode;../* G
8c50: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63  et the "model" c
8c60: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20  ontext */..chan 
8c70: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
8c80: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20  (interp, model, 
8c90: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61  &mode);..if (cha
8ca0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
8cb0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  l) NULL) {..    
8cc0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
8cd0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
8ce0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8cf0: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  OR;..}.../*.. * 
8d00: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8d10: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8d20: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f  ost channel.. */
8d30: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
8d40: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
8d50: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68  ;..if (Tcl_GetCh
8d60: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
8d70: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
8d80: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  pe()) {..    Tcl
8d90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8da0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
8db0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
8dc0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
8dd0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
8de0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
8df0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
8e00: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
8e10: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
8e20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
8e30: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a  .ctx = ((State *
8e40: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
8e50: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
8e60: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65  ))->ctx;.    } e
8e70: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20  lse {..if ((ctx 
8e80: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65  = CTX_Init(state
8e90: 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f  Ptr, server, pro
8ea0: 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72  to, keyfile, cer
8eb0: 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74  tfile, key, cert
8ec0: 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20  , key_len,..    
8ed0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c  cert_len, CAdir,
8ee0: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73   CAfile, ciphers
8ef0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20  , ciphersuites, 
8f00: 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29  level, DHparams)
8f10: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) == NULL) {..  
8f20: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
8f30: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
8f40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8f50: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
8f60: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74      statePtr->ct
8f70: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a  x = ctx;..    /*
8f80: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20  .     * We need 
8f90: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
8fa0: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f  t the channel wo
8fb0: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66  rks in binary (f
8fc0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e  or the.     * en
8fd0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20  cryption not to 
8fe0: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a  get goofed up)..
8ff0: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77       * We only w
9000: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68  ant to adjust th
9010: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70  e buffering in p
9020: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20  re-v2 channels, 
9030: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63  where.     * eac
9040: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65  h channel in the
9050: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65   stack maintaine
9060: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72  d its own buffer
9070: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54  s..     */.    T
9080: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
9090: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
90a0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
90b0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
90c0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
90d0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
90e0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
90f0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
9100: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9110: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
9120: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
9130: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
9140: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
9150: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  an, "-eofchar", 
9160: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
9170: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47  Char);.    Tcl_G
9180: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9190: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
91a0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65  encoding", &uppe
91b0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
91c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
91d0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
91e0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
91f0: 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72  slation", &upper
9200: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
9210: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  on);.    Tcl_Get
9220: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9230: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
9240: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43  ocking", &upperC
9250: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
9260: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9270: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9280: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
9290: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22  ation", "binary"
92a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
92b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
92c0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
92d0: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a  king", "true");.
92e0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e      dprintf("Con
92f0: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e  suming Tcl chann
9300: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  el %s", Tcl_GetC
9310: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
9320: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
9330: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63  >self = Tcl_Stac
9340: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
9350: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
9360: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  (), (ClientData)
9370: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f   statePtr, (TCL_
9380: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57  READABLE | TCL_W
9390: 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b  RITABLE), chan);
93a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72  .    dprintf("Cr
93b0: 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61  eated channel na
93c0: 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  med %s", Tcl_Get
93d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
93e0: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
93f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
9400: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
9410: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f  nnel) NULL) {../
9420: 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20  *.. * No use of 
9430: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72  Tcl_EventuallyFr
9440: 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f  ee because no po
9450: 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65  ssible Tcl_Prese
9460: 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46  rve... */..Tls_F
9470: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
9480: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
9490: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
94a0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
94b0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
94c0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
94d0: 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  f, "-translation
94e0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
94f0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
9500: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a  lTranslation));.
9510: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
9520: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9530: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
9540: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63   "-encoding", Tc
9550: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
9560: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
9570: 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  ding));.    Tcl_
9580: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9590: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
95a0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68  r->self, "-eofch
95b0: 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ar", Tcl_DString
95c0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
95d0: 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20  nelEOFChar));.  
95e0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
95f0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
9600: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
9610: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f  -blocking", Tcl_
9620: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
9630: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
9640: 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ng));..    /*.  
9650: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c     * SSL Initial
9660: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a  ization.     */.
9670: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73      statePtr->ss
9680: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74  l = SSL_new(stat
9690: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
96a0: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73  if (!statePtr->s
96b0: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69  sl) {../* SSL li
96c0: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09  brary error */..
96d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
96e0: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e  (interp, "couldn
96f0: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c  't construct ssl
9700: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41   session: ", REA
9710: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
9720: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65  NULL);..Tls_Free
9730: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
9740: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
9750: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9760: 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73     /* Set host s
9770: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20  erver name */.  
9780: 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65    if (servername
9790: 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65  ) {../* Sets the
97a0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64   server name ind
97b0: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 43 6c  ication (SNI) Cl
97c0: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73  ientHello extens
97d0: 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  ion */..if (!SSL
97e0: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
97f0: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
9800: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
9810: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
9820: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9830: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65  sult(interp, "se
9840: 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e  tting TLS host n
9850: 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61  ame extension fa
9860: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  iled", (char *) 
9870: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
9880: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
9890: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
98b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
98c0: 20 20 20 20 20 20 7d 0a 0a 09 2f 2a 20 43 6f 6e        }.../* Con
98d0: 66 69 67 75 72 65 20 73 65 72 76 65 72 20 68 6f  figure server ho
98e0: 73 74 20 6e 61 6d 65 20 63 68 65 63 6b 73 20 69  st name checks i
98f0: 6e 20 74 68 65 20 53 53 4c 20 63 6c 69 65 6e 74  n the SSL client
9900: 2e 20 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61  . Set DNS hostna
9910: 6d 65 20 74 6f 0a 09 20 20 20 6e 61 6d 65 20 66  me to..   name f
9920: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63  or peer certific
9930: 61 74 65 20 63 68 65 63 6b 73 2e 20 53 53 4c 5f  ate checks. SSL_
9940: 73 65 74 31 5f 68 6f 73 74 20 68 61 73 20 6c 69  set1_host has li
9950: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69  mitations. */..i
9960: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73  f (!SSL_add1_hos
9970: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  t(statePtr->ssl,
9980: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a   servername)) {.
9990: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
99a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73  esult(interp, "s
99b0: 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20  etting DNS host 
99c0: 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63  name failed", (c
99d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
99e0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
99f0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
9a00: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
9a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a20: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
9a30: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73     /* Resume ses
9a40: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69  sion id */.    i
9a50: 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26  f (session_id &&
9a60: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f   strlen(session_
9a70: 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53  id) <= SSL_MAX_S
9a80: 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b  ID_CTX_LENGTH) {
9a90: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73  ../* SSL_set_ses
9aa0: 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21  sion() */..if (!
9ab0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31  SSL_SESSION_set1
9ac0: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f  _id_context(SSL_
9ad0: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74  get_session(stat
9ae0: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73  ePtr->ssl), sess
9af0: 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65  ion_id, (unsigne
9b00: 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65  d int) strlen(se
9b10: 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20  ssion_id))) {.. 
9b20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9b30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73  ult(interp, "Res
9b40: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22  ume session id "
9b50: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20  , session_id, " 
9b60: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a  failed", (char *
9b70: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  ) NULL);.       
9b80: 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63       Tls_Free((c
9b90: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
9ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
9bb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9bc0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
9bd0: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f   (alpn) {../* Co
9be0: 6e 76 65 72 74 20 61 20 54 63 6c 20 6c 69 73 74  nvert a Tcl list
9bf0: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c   into a protocol
9c00: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f  -list in wire-fo
9c10: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65  rmat */..unsigne
9c20: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20  d char *protos, 
9c30: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  *p;..unsigned in
9c40: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  t protos_len = 0
9c50: 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63  ;..int i, len, c
9c60: 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  nt;..Tcl_Obj **l
9c70: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c  ist;...if (Tcl_L
9c80: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
9c90: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20  s(interp, alpn, 
9ca0: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20  &cnt, &list) != 
9cb0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
9cc0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
9cd0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
9ce0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9cf0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
9d00: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
9d10: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
9d20: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
9d30: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
9d40: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
9d50: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
9d60: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
9d70: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
9d80: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
9d90: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
9da0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
9db0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f  protocol name to
9dc0: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a  o long", (char *
9dd0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46  ) NULL);...Tls_F
9de0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
9df0: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
9e00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
9e10: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
9e20: 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09  en += 1 + len;..
9e30: 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65  }.../* Build the
9e40: 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63   complete protoc
9e50: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74  ol-list */..prot
9e60: 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f  os = ckalloc(pro
9e70: 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72  tos_len);../* pr
9e80: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e  otocol-lists con
9e90: 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65  sist of 8-bit le
9ea0: 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62  ngth-prefixed, b
9eb0: 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09  yte strings */..
9ec0: 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20  for (i = 0, p = 
9ed0: 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b  protos; i < cnt;
9ee0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61   i++) {..    cha
9ef0: 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74  r *str = Tcl_Get
9f00: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
9f10: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
9f20: 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09     *p++ = len;..
9f30: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74      memcpy(p, st
9f40: 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20  r, len);..    p 
9f50: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  += len;..}.../* 
9f60: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
9f70: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79  tos makes a copy
9f80: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c   of the protocol
9f90: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74  -list */../* Not
9fa0: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e: This function
9fb0: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72  s reverses the r
9fc0: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76  eturn value conv
9fd0: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53  ention */..if (S
9fe0: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
9ff0: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  os(statePtr->ssl
a000: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73  , protos, protos
a010: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63  _len)) {..    Tc
a020: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a030: 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74  nterp, "failed t
a040: 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f  o set ALPN proto
a050: 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20  cols", (char *) 
a060: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
a070: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a080: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b  atePtr);..    ck
a090: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20  free(protos);.. 
a0a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a0b0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f  ROR;..}.../* Sto
a0c0: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  re protocols lis
a0d0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  t */..statePtr->
a0e0: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b  protos = protos;
a0f0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
a100: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f  os_len = protos_
a110: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
a120: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  {..statePtr->pro
a130: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61  tos = NULL;..sta
a140: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
a150: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
a160: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
a170: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a  Callbacks.     *
a180: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70  /.    SSL_set_ap
a190: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d  p_data(statePtr-
a1a0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
a1b0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e  atePtr);./* poin
a1c0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a  t back to us */.
a1d0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
a1e0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
a1f0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
a200: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
a210: 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f 5f  SL_CTX_set_info_
a220: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
a230: 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c  r->ctx, InfoCall
a240: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
a250: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65  reate Tcl_Channe
a260: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f  l BIO Handler */
a270: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
a280: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74  _bio.= BIO_new_t
a290: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f  cl(statePtr, BIO
a2a0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73  _NOCLOSE);.    s
a2b0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42  tatePtr->bio.= B
a2c0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c  IO_new(BIO_f_ssl
a2d0: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65  ());..    if (se
a2e0: 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76  rver) {../* Serv
a2f0: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  er callbacks */.
a300: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70  .SSL_CTX_set_alp
a310: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
a320: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
a330: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
a340: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
a350: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
a360: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73  servername_arg(s
a370: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
a380: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
a390: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
a3a0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
a3b0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
a3c0: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62  r->ctx, SNICallb
a3d0: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ack);..SSL_CTX_s
a3e0: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
a3f0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
a400: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c  , HelloCallback,
a410: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
a420: 72 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  r);.../* Enable 
a430: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63  server to send c
a440: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65  ert request afte
a450: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53  r handshake (TLS
a460: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 69   1.3 only) */..i
a470: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
a480: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
a490: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f  .    SSL_verify_
a4a0: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64  client_post_hand
a4b0: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e  shake(statePtr->
a4c0: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 73 74 61 74 65  ssl);..}...state
a4d0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
a4e0: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53  S_TCL_SERVER;..S
a4f0: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74  SL_set_accept_st
a500: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
a510: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
a520: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
a530: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
a540: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
a550: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
a560: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
a570: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
a580: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
a590: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
a5a0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
a5b0: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
a5c0: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
a5d0: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
a5e0: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
a5f0: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
a600: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
a610: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
a620: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
a630: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
a640: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
a650: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
a660: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
a670: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
a680: 31 29 3b 0a 09 7d 0a 0a 09 53 53 4c 5f 73 65 74  1);..}...SSL_set
a690: 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73  _connect_state(s
a6a0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
a6b0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74     }.    SSL_set
a6c0: 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73  _bio(statePtr->s
a6d0: 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  sl, statePtr->p_
a6e0: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  bio, statePtr->p
a6f0: 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73  _bio);.    BIO_s
a700: 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d  et_ssl(statePtr-
a710: 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e  >bio, statePtr->
a720: 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45  ssl, BIO_NOCLOSE
a730: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
a740: 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69  * End of SSL Ini
a750: 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70  t.     */.    dp
a760: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
a770: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
a780: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
a790: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54  r->self));.    T
a7a0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
a7b0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63  erp, (char *) Tc
a7c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
a7d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
a7e0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
a7f0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a800: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
a810: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
a820: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
a830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
a870: 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  * UnimportObjCmd
a880: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
a890: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
a8a0: 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ked to remove th
a8b0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
a8c0: 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20  l filter.. *. * 
a8d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
a8e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
a8f0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
a900: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
a910: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
a920: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
a930: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
a940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
a980: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d  .static int.Unim
a990: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
a9a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
a9b0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
a9c0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
a9d0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
a9e0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
a9f0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
aa00: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
aa10: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
aa20: 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
aa30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
aa40: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
aa50: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
aa60: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
aa70: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
aa80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
aa90: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
aaa0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
aab0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
aac0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
aad0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
aae0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
aaf0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
ab00: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
ab10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ab20: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
ab30: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
ab40: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
ab50: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
ab60: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
ab70: 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54  han);..    if (T
ab80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
ab90: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
aba0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
abb0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
abc0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
abd0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
abe0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
abf0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
ac00: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
ac10: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
ac20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ac30: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  ..    if (Tcl_Un
ac40: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
ac50: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43  erp, chan) == TC
ac60: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75  L_ERROR) {..retu
ac70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ac80: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
ac90: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
aca0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
acb0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
acc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
acd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ace0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
acf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
ad00: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d  *. * CTX_Init --
ad10: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c   construct a SSL
ad20: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a  _CTX instance. *
ad30: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
ad40: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20  A valid SSL_CTX 
ad50: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c  instance or NULL
ad60: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
ad70: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75  ects:. *.constru
ad80: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  cts SSL context 
ad90: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
ade0: 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54  */.static SSL_CT
adf0: 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61  X *.CTX_Init(Sta
ae00: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e  te *statePtr, in
ae10: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20  t isServer, int 
ae20: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79  proto, char *key
ae30: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74  file, char *cert
ae40: 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e  file,.    unsign
ae50: 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e  ed char *key, un
ae60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
ae70: 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20  t, int key_len, 
ae80: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68  int cert_len, ch
ae90: 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63  ar *CAdir,.    c
aea0: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61  har *CAfile, cha
aeb0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
aec0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
aed0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
aee0: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
aef0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
af00: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
af10: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
af20: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
af30: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
af40: 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74   ds;.    Tcl_DSt
af50: 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e  ring ds1;.    in
af60: 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  t off = 0;.    i
af70: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  nt load_private_
af80: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  key;.    const S
af90: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
afa0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
afb0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
afc0: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54  if (!proto) {..T
afd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
afe0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69  interp, "no vali
aff0: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  d protocol selec
b000: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
b010: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
b020: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20  ..    /* create 
b030: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  SSL context */.#
b040: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
b050: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
b060: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
b070: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
b080: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
b090: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
b0a0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
b0b0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
b0c0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
b0d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
b0e0: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L2 protocol not 
b0f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
b100: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
b110: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
b120: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
b130: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
b140: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20  ENSSL_NO_SSL3). 
b150: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
b160: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
b170: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL3)) {..Tcl_Ap
b180: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b190: 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f  p, "SSL3 protoco
b1a0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
b1b0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
b1c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
b1d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
b1e0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
b1f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
b200: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  LS1).    if (ENA
b210: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
b220: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09  PROTO_TLS1)) {..
b230: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b240: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
b250: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  0 protocol not s
b260: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
b270: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
b280: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
b290: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
b2a0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
b2b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
b2c0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
b2d0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
b2e0: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
b2f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b300: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
b310: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
b320: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
b330: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
b340: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
b350: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
b360: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
b370: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
b380: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
b390: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
b3a0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63  O_TLS1_2)) {..Tc
b3b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b3c0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20  nterp, "TLS 1.2 
b3d0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
b3e0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
b3f0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
b400: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
b410: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
b420: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
b430: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
b440: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
b450: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
b460: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
b470: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b480: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
b490: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
b4a0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
b4b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
b4c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
b4d0: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a  witch (proto) {.
b4e0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
b4f0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
b500: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
b510: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
b520: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
b530: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
b540: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
b550: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L2:..method = is
b560: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73  Server ? SSLv2_s
b570: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
b580: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv2_client_me
b590: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
b5a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
b5b0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
b5c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
b5d0: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
b5e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
b5f0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
b600: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
b610: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL3:..method =
b620: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
b630: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  3_server_method(
b640: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74  ) : SSLv3_client
b650: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
b660: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
b670: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
b680: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
b690: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
b6a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
b6b0: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
b6c0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
b6d0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f  OTO_TLS1:..metho
b6e0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
b6f0: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  LSv1_server_meth
b700: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69  od() : TLSv1_cli
b710: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
b720: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
b730: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
b740: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
b750: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b760: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
b770: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
b780: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
b790: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
b7a0: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_1:..method = i
b7b0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
b7c0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
b7d0: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65  ) : TLSv1_1_clie
b7e0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
b7f0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
b800: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
b810: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
b820: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
b830: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
b840: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
b850: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
b860: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
b870: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  _2:..method = is
b880: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32  Server ? TLSv1_2
b890: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
b8a0: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e   : TLSv1_2_clien
b8b0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
b8c0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
b8d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
b8e0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
b8f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
b900: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
b910: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a  ROTO_TLS1_3:../*
b920: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63   Use the generic
b930: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73   method and cons
b940: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74  traint range aft
b950: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72  er context is cr
b960: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64  eated */..method
b970: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
b980: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
b990: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
b9a0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
b9b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
b9c0: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61  ult:../* Negotia
b9d0: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c  te highest avail
b9e0: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72  able SSL/TLS ver
b9f0: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  sion */..method 
ba00: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
ba10: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
ba20: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65   : TLS_client_me
ba30: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e  thod();.#if OPEN
ba40: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
ba50: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
ba60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
ba70: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
ba80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
ba90: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
baa0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
bab0: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30  ROTO_SSL2)   ? 0
bac0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
bad0: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v2);.#endif.#if 
bae0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
baf0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
bb00: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09  ENSSL_NO_SSL3)..
bb10: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
bb20: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
bb30: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53  _SSL3)   ? 0 : S
bb40: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
bb50: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
bb60: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
bb70: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
bb80: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20  L_NO_TLS1)..off 
bb90: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
bba0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
bbb0: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1)   ? 0 : SSL_O
bbc0: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e  P_NO_TLSv1);.#en
bbd0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
bbe0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
bbf0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
bc00: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20  NO_TLS1_1)..off 
bc10: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
bc20: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
bc30: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_1) ? 0 : SSL_O
bc40: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23  P_NO_TLSv1_1);.#
bc50: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
bc60: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
bc70: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
bc80: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66  L_NO_TLS1_2)..of
bc90: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
bca0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
bcb0: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_2) ? 0 : SSL
bcc0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b  _OP_NO_TLSv1_2);
bcd0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
bce0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
bcf0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
bd00: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
bd10: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
bd20: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
bd30: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53  _TLS1_3) ? 0 : S
bd40: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33  SL_OP_NO_TLSv1_3
bd50: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b  );.#endif..break
bd60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
bd70: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
bd80: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
bd90: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 0a  X_new(method);..
bda0: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a      if (!ctx) {.
bdb0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20  .return(NULL);. 
bdc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65     }..    if (ge
bdd0: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
bde0: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  LE)) {..SSL_CTX_
bdf0: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62  set_keylog_callb
be00: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43  ack(ctx, KeyLogC
be10: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
be20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
be30: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
be40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
be50: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
be60: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f  proto == TLS_PRO
be70: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53  TO_TLS1_3) {..SS
be80: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
be90: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
bea0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
beb0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
bec0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
bed0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
bee0: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  SION);.    }.#en
bef0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63  dif..    /* Forc
bf00: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69  e cipher selecti
bf10: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76  on order by serv
bf20: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69  er */.    if (!i
bf30: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f  sServer) {..SSL_
bf40: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
bf50: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48  ctx, SSL_OP_CIPH
bf60: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52  ER_SERVER_PREFER
bf70: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ENCE);.    }..  
bf80: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70    SSL_CTX_set_ap
bf90: 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  p_data(ctx, (voi
bfa0: 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72  d*)interp);./* r
bfb0: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65  emember the inte
bfc0: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53  rpreter */.    S
bfd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
bfe0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41  ns(ctx, SSL_OP_A
bff0: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20  LL);./* all SSL 
c000: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20  bug workarounds 
c010: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
c020: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
c030: 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c  off);../* disabl
c040: 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69  e protocol versi
c050: 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ons */.#if OPENS
c060: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
c070: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a  R < 0x10101000L.
c080: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c090: 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f  mode(ctx, SSL_MO
c0a0: 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09  DE_AUTO_RETRY);.
c0b0: 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61  /* handle new ha
c0c0: 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b  ndshakes in back
c0d0: 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 66  ground */.#endif
c0e0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
c0f0: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
c100: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
c110: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
c120: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
c130: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
c140: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
c150: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
c160: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
c170: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
c180: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
c190: 70 68 65 72 73 29 29 20 7b 0a 09 20 20 20 20 54  phers)) {..    T
c1a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c1b0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
c1c0: 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20  hers failed: No 
c1d0: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20  valid ciphers", 
c1e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c1f0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
c200: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
c210: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
c220: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
c230: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26  uites != NULL) &
c240: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  & !SSL_CTX_set_c
c250: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c  iphersuites(ctx,
c260: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20   ciphersuites)) 
c270: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
c280: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c290: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
c2a0: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
c2b0: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
c2c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
c2d0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
c2e0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
c2f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
c300: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
c310: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
c320: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
c330: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
c340: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
c350: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
c360: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
c370: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
c380: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
c390: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
c3a0: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
c3b0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
c3c0: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
c3d0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
c3e0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
c3f0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
c400: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
c410: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c420: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
c430: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
c440: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
c450: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
c460: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
c470: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f  .#ifdef OPENSSL_
c480: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48  NO_DH.    if (DH
c490: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
c4a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c4b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20  ult(interp, "DH 
c4c0: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72  parameter suppor
c4d0: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22  t not available"
c4e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c4f0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
c500: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
c510: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  LL;.    }.#else.
c520: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09      {..DH* dh;..
c530: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
c540: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f  NULL) {..    BIO
c550: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f   *bio;..    Tcl_
c560: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
c570: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ;..    bio = BIO
c580: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
c590: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
c5a0: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
c5b0: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
c5c0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
c5d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c5e0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
c5f0: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
c600: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
c610: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
c620: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
c630: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
c640: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68  ..    }...    dh
c650: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f   = PEM_read_bio_
c660: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55  DHparams(bio, NU
c670: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
c680: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
c690: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  io);..    Tcl_DS
c6a0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
c6b0: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a  .    if (!dh) {.
c6c0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c6d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
c6e0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61  d not read DH pa
c6f0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69  rameters from fi
c700: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
c710: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
c720: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
c730: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
c740: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64  .} else {..    d
c750: 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73  h = get_dhParams
c760: 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f  ();..}..SSL_CTX_
c770: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20  set_tmp_dh(ctx, 
c780: 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68  dh);..DH_free(dh
c790: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
c7a0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
c7b0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20  certificate */. 
c7c0: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f     load_private_
c7d0: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  key = 0;.    if 
c7e0: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c  (certfile != NUL
c7f0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
c800: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63  te_key = 1;...Tc
c810: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
c820: 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  s);...if (SSL_CT
c830: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
c840: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
c850: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
c860: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
c870: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
c880: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
c890: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
c8a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c8b0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
c8c0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
c8d0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
c8e0: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45  ": ",....     RE
c8f0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
c900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
c910: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
c920: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
c930: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
c940: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c  if (cert != NULL
c950: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
c960: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28  e_key = 1;..if (
c970: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
c980: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78  ificate_ASN1(ctx
c990: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74  , cert_len, cert
c9a0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
c9b0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
c9c0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
c9d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c9e0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
c9f0: 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22  t certificate: "
ca00: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e  ,....     REASON
ca10: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
ca20: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
ca30: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
ca40: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
ca50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63  .    } else {..c
ca60: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a  ertfile = (char*
ca70: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c  )X509_get_defaul
ca80: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a  t_cert_file();..
ca90: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
caa0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
cab0: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c  e(ctx, certfile,
cac0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
cad0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30  M) <= 0) {.#if 0
cae0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
caf0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
cb00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
cb10: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
cb20: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74  e to use default
cb30: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
cb40: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
cb50: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41  : ",....     REA
cb60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
cb70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
cb80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
cb90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
cba0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d  .#endif..}.    }
cbb0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
cbc0: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a   private key */.
cbd0: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69      if (load_pri
cbe0: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20  vate_key) {..if 
cbf0: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
cc00: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29   && key == NULL)
cc10: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20   {..    keyfile 
cc20: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a  = certfile;..}..
cc30: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20  .if (keyfile != 
cc40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20  NULL) {..    /* 
cc50: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20  get the private 
cc60: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
cc70: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69  ith this certifi
cc80: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20  cate */..    if 
cc90: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
cca0: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20  ) {...keyfile = 
ccb0: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d  certfile;..    }
ccc0: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  ...    if (SSL_C
ccd0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
cce0: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
ccf0: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  keyfile, &ds), S
cd00: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
cd10: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
cd20: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
cd30: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
cd40: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
cd50: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
cd60: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
cd70: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
cd80: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
cd90: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
cda0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
cdb0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
cdc0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20   set public key 
cdd0: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c  file ", keyfile,
cde0: 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20   " ",....       
cdf0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
ce00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
ce10: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ce20: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
ce30: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
ce40: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ce50: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b  ;...} else if (k
ce60: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey != NULL) {.. 
ce70: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
ce80: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53  se_PrivateKey_AS
ce90: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c  N1(EVP_PKEY_RSA,
cea0: 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65   ctx, key,key_le
ceb0: 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  n) <= 0) {...Tcl
cec0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
ced0: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
cee0: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
cef0: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
cf00: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
cf10: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
cf20: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
cf30: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
cf40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cf50: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
cf60: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
cf70: 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  y: ", REASON(), 
cf80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
cf90: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
cfa0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
cfb0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f  LL;..    }..}../
cfc0: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68  * Now we know th
cfd0: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72  at a key and cer
cfe0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  t have been set 
cff0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20  against.. * the 
d000: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  SSL context */..
d010: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65  if (!SSL_CTX_che
d020: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63  ck_private_key(c
d030: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  tx)) {..    Tcl_
d040: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d050: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65  erp, "private ke
d060: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
d070: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
d080: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09   public key",...
d090: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e  .     (char *) N
d0a0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
d0b0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
d0c0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
d0d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
d0e0: 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f   Set verificatio
d0f0: 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c  n CAs */.    Tcl
d100: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
d110: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
d120: 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20  ngInit(&ds1);.  
d130: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c    if (!SSL_CTX_l
d140: 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74  oad_verify_locat
d150: 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41  ions(ctx, F2N(CA
d160: 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28  file, &ds), F2N(
d170: 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c  CAdir, &ds1)) ||
d180: 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64  ..!SSL_CTX_set_d
d190: 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61  efault_verify_pa
d1a0: 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20  ths(ctx)) {.#if 
d1b0: 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  0..Tcl_DStringFr
d1c0: 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53  ee(&ds);..Tcl_DS
d1d0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b  tringFree(&ds1);
d1e0: 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65  ../* Don't curre
d1f0: 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69  ntly care if thi
d200: 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f  s fails */..Tcl_
d210: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d220: 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c  erp, "SSL defaul
d230: 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20  t verify paths: 
d240: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
d250: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
d260: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
d270: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23  ..return NULL;.#
d280: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
d290: 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72   /* https://sour
d2a0: 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c  ceforge.net/p/tl
d2b0: 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20  s/bugs/57/ */.  
d2c0: 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c    /* XXX:TODO: L
d2d0: 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70  et the user supp
d2e0: 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69  ly values here i
d2f0: 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68  nstead of someth
d300: 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20  ing that exists 
d310: 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  on the filesyste
d320: 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66  m */.    if (CAf
d330: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
d340: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
d350: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d  ME) *certNames =
d360: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74   SSL_load_client
d370: 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66  _CA_file(F2N(CAf
d380: 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20  ile, &ds));..if 
d390: 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55  (certNames != NU
d3a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43  LL) {..    SSL_C
d3b0: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_set_client_CA
d3c0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e  _list(ctx, certN
d3d0: 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ames);..}.    }.
d3e0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d3f0: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54  Free(&ds);.    T
d400: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d410: 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ds1);.    return
d420: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   ctx;.}.../*. *-
d430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f  --. *. * StatusO
d480: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
d490: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
d4a0: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a  connected peer..
d4b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
d4c0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
d4d0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
d4e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
d4f0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
d540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74  */.static int.St
d550: 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  atusObjCmd(Clien
d560: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
d570: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
d580: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
d590: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
d5a0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61  bjv[]) {.    Sta
d5b0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
d5c0: 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20    X509 *peer;.  
d5d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
d5e0: 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  r;.    Tcl_Chann
d5f0: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61  el chan;.    cha
d600: 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  r *channelName, 
d610: 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e  *ciphers;.    in
d620: 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t mode;.    cons
d630: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
d640: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69  *proto;.    unsi
d650: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  gned int len;.  
d660: 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 20 20 20    int nid;..    
d670: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
d680: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28  );..    switch (
d690: 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a  objc) {..case 2:
d6a0: 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  ..    channelNam
d6b0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
d6c0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
d6d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
d6e0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09  eak;...case 3:..
d6f0: 20 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 20      if (!strcmp 
d700: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28  (Tcl_GetString (
d710: 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61  objv[1]), "-loca
d720: 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c  l")) {...channel
d730: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
d740: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
d750: 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72  [2], NULL);...br
d760: 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  eak;..    }..   
d770: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68   /* else fall-th
d780: 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66  rough ... */.#if
d790: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
d7a0: 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62  _)..    __attrib
d7b0: 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75  ute__((fallthrou
d7c0: 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65  gh));.#endif..de
d7d0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f  fault:..    Tcl_
d7e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d7f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
d800: 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22  -local? channel"
d810: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
d820: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d830: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
d840: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
d850: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  p, channelName, 
d860: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
d870: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
d880: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
d890: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d 61  .    }.    /* Ma
d8b0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
d8c0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
d8d0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
d8e0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
d8f0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
d900: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
d910: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
d920: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
d930: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
d940: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d950: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
d960: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
d970: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
d980: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
d990: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
d9a0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
d9b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
d9c0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
d9d0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
d9e0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
d9f0: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62  han);.    if (ob
da00: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72  jc == 2) {..peer
da10: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
da20: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
da30: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
da40: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d  } else {..peer =
da50: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69   SSL_get_certifi
da60: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
da70: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  sl);.    }.    i
da80: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
da90: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
daa0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
dab0: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
dac0: 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70  2) { X509_free(p
dad0: 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c  eer); }.    } el
dae0: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
daf0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
db00: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
db10: 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20     /* Peer cert 
db20: 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e  chain (client on
db30: 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b  ly) */.    STACK
db40: 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63  _OF(X509)* ssl_c
db50: 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70  erts = SSL_get_p
db60: 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73  eer_cert_chain(s
db70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
db80: 20 20 20 69 66 20 28 21 70 65 65 72 20 26 26 20     if (!peer && 
db90: 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55  (ssl_certs == NU
dba0: 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75  LL || sk_X509_nu
dbb0: 6d 28 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20  m(ssl_certs) == 
dbc0: 30 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  0)) {..return TC
dbd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
dbe0: 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65      /* Peer name
dbf0: 20 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20 20   from cert */.  
dc00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
dc10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
dc20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
dc30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65  ewStringObj("pee
dc40: 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20  rname", -1));.  
dc50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
dc60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
dc70: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
dc80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
dc90: 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
dca0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
dcb0: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ));..    Tcl_Lis
dcc0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
dcd0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
dce0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
dcf0: 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29  bj("sbits", -1))
dd00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
dd10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
dd20: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
dd30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
dd40: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73  _get_cipher_bits
dd50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
dd60: 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69  NULL)));..    ci
dd70: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
dd80: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
dd90: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
dda0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
ddb0: 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63  = NULL) && (strc
ddc0: 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f  mp(ciphers, "(NO
ddd0: 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09  NE)") != 0)) {..
dde0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ddf0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
de00: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
de10: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65  StringObj("ciphe
de20: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
de30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
de40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
de50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
de60: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70  gObj(SSL_get_cip
de70: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  her(statePtr->ss
de80: 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  l), -1));.    }.
de90: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
dea0: 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63  he X509 certific
deb0: 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79  ate presented by
dec0: 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20   the peer */.   
ded0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
dee0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
def0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
df00: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69  wStringObj("veri
df10: 66 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  fication", -1));
df20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
df30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
df40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 54  terp, objPtr,..T
df50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
df60: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
df70: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
df80: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
df90: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
dfa0: 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  l)), -1));..    
dfb0: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
dfc0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
dfd0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
dfe0: 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  he negotiation *
dff0: 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61  /.    SSL_get0_a
e000: 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
e010: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
e020: 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54  to, &len);.    T
e030: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e040: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e050: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e060: 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c  tringObj("alpn",
e070: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
e080: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e090: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
e0a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
e0b0: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f  gObj((char *)pro
e0c0: 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b  to, (int) len));
e0d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
e0e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
e0f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
e100: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
e110: 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b  protocol", -1));
e120: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
e130: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
e140: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
e150: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
e160: 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
e170: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
e180: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  1));..    /* Val
e190: 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73  id for non-RSA s
e1a0: 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53  ignature and TLS
e1b0: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   1.3 */.    Tcl_
e1c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e1d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e1e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e1f0: 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65  ngObj("signature
e200: 5f 68 61 73 68 22 2c 20 2d 31 29 29 3b 0a 20 20  _hash", -1));.  
e210: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20    if (objc == 2 
e220: 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73  ? SSL_get_peer_s
e230: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61  ignature_nid(sta
e240: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
e250: 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  ) : SSL_get_sign
e260: 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
e270: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20  tr->ssl, &nid)) 
e280: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
e290: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e2a0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e2b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a  NewStringObj(OBJ
e2c0: 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
e2d0: 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ));.    } else {
e2e0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
e2f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
e300: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
e310: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
e320: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
e330: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e340: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e350: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
e360: 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61  StringObj("signa
e370: 74 75 72 65 5f 74 79 70 65 22 2c 20 2d 31 29 29  ture_type", -1))
e380: 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ;.    if (objc =
e390: 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65  = 2 ? SSL_get_pe
e3a0: 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
e3b0: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
e3c0: 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c  ssl, &nid) : SSL
e3d0: 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74  _get_signature_t
e3e0: 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ype_nid(statePtr
e3f0: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a  ->ssl, &nid)) {.
e400: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
e410: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
e420: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
e430: 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e  wStringObj(OBJ_n
e440: 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29  id2ln(nid), -1))
e450: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
e460: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e470: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e480: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
e490: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
e4a0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ));.    }..    T
e4b0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e4c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
e4d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e4e0: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
e4f0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
e500: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
e510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
e550: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
e560: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
e570: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  connection info 
e580: 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
e590: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
e5a0: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63  A list of connec
e5b0: 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a  tion info.  *. *
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e600: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
e610: 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  int ConnectionIn
e620: 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  foObjCmd(ClientD
e630: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
e640: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e650: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
e660: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
e670: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
e680: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
e690: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
e6a0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
e6b0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
e6c0: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
e6d0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
e6e0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
e6f0: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20  l_Obj *objPtr;. 
e700: 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
e710: 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
e720: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
e730: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
e740: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
e750: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
e760: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b  ned char *proto;
e770: 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a  .    long mode;.
e780: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
e790: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
e7a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e7b0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
e7c0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  l");..return(TCL
e7d0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
e7e0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
e7f0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
e800: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
e810: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
e820: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
e830: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
e840: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
e850: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
e860: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
e870: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
e880: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
e890: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
e8a0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
e8b0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
e8c0: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
e8d0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
e8e0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
e8f0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
e900: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e910: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
e920: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
e930: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
e940: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74  (chan), "\": not
e950: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
e960: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
e970: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
e980: 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  }..    objPtr = 
e990: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
e9a0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a  , NULL);..    /*
e9b0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   Connection info
e9c0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
e9d0: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f   = (State *)Tcl_
e9e0: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
e9f0: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20  ceData(chan);.  
ea00: 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72    ssl = statePtr
ea10: 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73  ->ssl;.    if (s
ea20: 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f  sl != NULL) {../
ea30: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61  * connection sta
ea40: 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  te */..Tcl_ListO
ea50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ea60: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ea70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ea80: 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a  ("state", -1));.
ea90: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
eaa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
eab0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
eac0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73  wStringObj(SSL_s
ead0: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  tate_string_long
eae0: 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f  (ssl), -1));.../
eaf0: 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73  * Get SNI reques
eb00: 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ted server name 
eb10: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
eb20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
eb30: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
eb40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
eb50: 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29  ervername", -1))
eb60: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
eb70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
eb80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
eb90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
eba0: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28  _get_servername(
ebb0: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45  ssl, TLSEXT_NAME
ebc0: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c  TYPE_host_name),
ebd0: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20   -1));.../* Get 
ebe0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c  protocol */..Tcl
ebf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ec00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ec10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ec20: 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c  ingObj("protocol
ec30: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
ec40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ec50: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ec60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ec70: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73  Obj(SSL_get_vers
ec80: 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  ion(ssl), -1));.
ec90: 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69  ../* Renegotiati
eca0: 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54  on allowed */..T
ecb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ecc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ecd0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
ece0: 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f  tringObj("renego
ecf0: 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  tiation", -1));.
ed00: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
ed10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
ed20: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
ed30: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20  wStringObj(..   
ed40: 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f   SSL_get_secure_
ed50: 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75  renegotiation_su
ed60: 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 75  pport(ssl) ? "su
ed70: 70 70 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 20  pported" : "not 
ed80: 73 75 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29  supported", -1))
ed90: 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72  ;.../* Get secur
eda0: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63  ity level */..Tc
edb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
edc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
edd0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ede0: 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 74  ringObj("securit
edf0: 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09  ylevel", -1));..
ee00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ee10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
ee20: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
ee30: 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73  IntObj(SSL_get_s
ee40: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73  ecurity_level(ss
ee50: 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  l)));.../* Sessi
ee60: 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f  on info */..Tcl_
ee70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ee80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ee90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
eea0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72  ngObj("session_r
eeb0: 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54  eused", -1));..T
eec0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
eed0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
eee0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
eef0: 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 65  ooleanObj(SSL_se
ef00: 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c  ssion_reused(ssl
ef10: 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  )));.../* Is ser
ef20: 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c  ver info */..Tcl
ef30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ef40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ef50: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ef60: 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65 72 76 65  ingObj("is_serve
ef70: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
ef80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ef90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
efa0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
efb0: 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 65 72  anObj(SSL_is_ser
efc0: 76 65 72 28 73 73 6c 29 29 29 3b 0a 20 20 20 20  ver(ssl)));.    
efd0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
efe0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
eff0: 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
f000: 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
f010: 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
f020: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
f030: 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
f040: 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
f050: 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 6c   alg_bits;...Tcl
f060: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f070: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
f080: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f090: 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c  ingObj("cipher",
f0a0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
f0b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f0c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f0d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f0e0: 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  j(SSL_CIPHER_get
f0f0: 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
f100: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f110: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f120: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f130: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f140: 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
f150: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
f160: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f170: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f180: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f190: 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61  j(SSL_CIPHER_sta
f1a0: 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65  ndard_name(ciphe
f1b0: 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 73  r), -1));...bits
f1c0: 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
f1d0: 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26  t_bits(cipher, &
f1e0: 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c 5f  alg_bits);..Tcl_
f1f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f200: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
f210: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
f220: 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d 31  ngObj("bits", -1
f230: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f240: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f250: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f260: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 73  l_NewIntObj(bits
f270: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f280: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f290: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f2a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f2b0: 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d 31  secret_bits", -1
f2c0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f2d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f2e0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f2f0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f  l_NewIntObj(alg_
f300: 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f  bits));../* alg_
f310: 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b  bits is actual k
f320: 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20  ey secret bits. 
f330: 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20  If use bits and 
f340: 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68  secret (algorith
f350: 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a  m) bits differ,.
f360: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
f370: 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20  est of the bits 
f380: 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20  are fixed, i.e. 
f390: 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f  for limited expo
f3a0: 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73  rt ciphers (bits
f3b0: 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c   < 56) */..Tcl_L
f3c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f3d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f3e0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f3f0: 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f  gObj("min_versio
f400: 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
f410: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f420: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f430: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f440: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f  gObj(SSL_CIPHER_
f450: 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
f460: 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  er), -1));.../* 
f470: 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63  Get OpenSSL-spec
f480: 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e  ific ID, not IAN
f490: 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  A ID */..Tcl_Lis
f4a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f4b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
f4c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f4d0: 62 6a 28 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09  bj("id", -1));..
f4e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f4f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f500: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f510: 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c  IntObj((int) SSL
f520: 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
f530: 69 70 68 65 72 29 29 29 3b 0a 0a 09 69 66 20 28  ipher)));...if (
f540: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
f550: 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62  iption(cipher, b
f560: 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
f570: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
f580: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f5a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f5b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 73 63  wStringObj("desc
f5c0: 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  ription", -1));.
f5d0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f5e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f5f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f600: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
f610: 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20  uf, -1));..}.   
f620: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69   }..    /* Sessi
f630: 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
f640: 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74  ession = SSL_get
f650: 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20  _session(ssl);. 
f660: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21     if (session !
f670: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
f680: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f690: 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ticket;..size_t 
f6a0: 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20  len2;..unsigned 
f6b0: 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74  int ulen;..const
f6c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f6d0: 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61  session_id;..cha
f6e0: 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58  r buffer[SSL_MAX
f6f0: 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
f700: 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  TH];.../* Report
f710: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
f720: 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
f730: 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e  lt of the ALPN n
f740: 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53  egotiation */..S
f750: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
f760: 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65  alpn_selected(se
f770: 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26  ssion, &proto, &
f780: 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  len2);..Tcl_List
f790: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f7a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f7b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f7c0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
f7d0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f7e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f7f0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f800: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
f810: 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20   *)proto, (int) 
f820: 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 73  len2));.../* Res
f830: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
f840: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
f850: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f860: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f870: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65  NewStringObj("re
f880: 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a  sumable", -1));.
f890: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f8a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f8b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f8c0: 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53  wIntObj(SSL_SESS
f8d0: 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
f8e0: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
f8f0: 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
f900: 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
f910: 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54  nce epoch) */..T
f920: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f930: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f940: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
f950: 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f  tringObj("start_
f960: 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  time", -1));..Tc
f970: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f980: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f990: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f  bjPtr, Tcl_NewLo
f9a0: 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f  ngObj(SSL_SESSIO
f9b0: 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69  N_get_time(sessi
f9c0: 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  on)));.../* Time
f9d0: 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
f9e0: 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
f9f0: 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
fa00: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
fa10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fa20: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fa30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65  wStringObj("time
fa40: 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  out", -1));..Tcl
fa50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fa60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fa70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  jPtr, Tcl_NewLon
fa80: 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  gObj(SSL_SESSION
fa90: 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73  _get_timeout(ses
faa0: 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65  sion)));.../* Se
fab0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66  ssion ticket lif
fac0: 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73  etime hint (in s
fad0: 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f  econds) */..Tcl_
fae0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
faf0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fb00: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
fb10: 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22  ngObj("lifetime"
fb20: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fb30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fb40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fb50: 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
fb60: 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  (SSL_SESSION_get
fb70: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
fb80: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29  _hint(session)))
fb90: 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69  ;.../* Session i
fba0: 64 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  d */..session_id
fbb0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
fbc0: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
fbd0: 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  ulen);..Tcl_List
fbe0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fbf0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fc00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fc10: 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  j("session_id", 
fc20: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
fc30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fc40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fc50: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
fc60: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
fc70: 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09  (int) ulen));...
fc80: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
fc90: 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
fca0: 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
fcb0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
fcc0: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
fcd0: 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  en2);..Tcl_ListO
fce0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fcf0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fd00: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
fd10: 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74  ("session_ticket
fd20: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
fd30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fd40: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fd50: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
fd60: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
fd70: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f  int) len2));.../
fd80: 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
fd90: 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f  a */..SSL_SESSIO
fda0: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
fdb0: 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26  pdata(session, &
fdc0: 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
fdd0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
fde0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fdf0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fe00: 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b  wStringObj("tick
fe10: 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31  et_app_data", -1
fe20: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
fe30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fe40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
fe50: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
fe60: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20  j(ticket, (int) 
fe70: 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  len2));.../* Get
fe80: 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09   master key */..
fe90: 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49  len2 = SSL_SESSI
fea0: 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65  ON_get_master_ke
feb0: 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65  y(session, buffe
fec0: 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  r, SSL_MAX_MASTE
fed0: 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09  R_KEY_LENGTH);..
fee0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fef0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
ff00: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
ff10: 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65  StringObj("maste
ff20: 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54  r_key", -1));..T
ff30: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ff40: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ff50: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
ff60: 79 74 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66  yteArrayObj(buff
ff70: 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29  er, (int) len2))
ff80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ff90: 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
ffa0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
ffb0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
ffc0: 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
ffd0: 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
ffe0: 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
fff0: 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
10000 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
10010 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
10020 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
10030 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
10040 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f  ion(ssl);...Tcl_
10050 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10060 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10070 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10080 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69  ngObj("compressi
10090 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
100a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
100b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
100c0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
100d0 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c  ngObj(comp ? SSL
100e0 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63  _COMP_get_name(c
100f0 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d  omp) : "NONE", -
10100 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
10110 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10120 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10130 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10140 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29  "expansion", -1)
10150 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10160 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10170 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10180 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78  _NewStringObj(ex
10190 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  pn ? SSL_COMP_ge
101a0 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22  t_name(expn) : "
101b0 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c  NONE", -1));.#el
101c0 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  se..Tcl_ListObjA
101d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
101e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
101f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
10200 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29  ompression", -1)
10210 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10220 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10230 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10240 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e  _NewStringObj("N
10250 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ONE", -1));..Tcl
10260 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10270 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10280 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10290 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f  ingObj("expansio
102a0 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
102b0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
102c0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
102d0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
102e0 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29  gObj("NONE", -1)
102f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
10300 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
10310 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20  nfo */.    mode 
10320 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65  = SSL_CTX_get_se
10330 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
10340 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
10350 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20  .    if (mode & 
10360 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f  SSL_SESS_CACHE_O
10370 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22  FF) {..proto = "
10380 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  off";.    } else
10390 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
103a0 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
103b0 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63  T) {..proto = "c
103c0 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c  lient";.    } el
103d0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
103e0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
103f0 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20  VER) {..proto = 
10400 22 73 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20  "server";.    } 
10410 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
10420 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42  SSL_SESS_CACHE_B
10430 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20  OTH) {..proto = 
10440 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c  "both";.    } el
10450 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75  se {..proto = "u
10460 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20  nknown";.    }. 
10470 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10480 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10490 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
104a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
104b0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
104c0 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
104d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
104e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
104f0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10500 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31  ingObj(proto, -1
10510 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
10520 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10530 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
10540 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
10550 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
10560 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
10570 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105b0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69  ----. *. * Versi
105c0 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  onObjCmd -- retu
105d0 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  rn version strin
105e0 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  g from OpenSSL..
105f0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
10600 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
10610 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
10620 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
10630 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
10690 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65  rsionObjCmd(Clie
106a0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
106b0 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
106c0 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
106d0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
106e0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
106f0 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
10700 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
10710 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50  led");..    objP
10720 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
10730 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45  ngObj(OPENSSL_VE
10740 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b  RSION_TEXT, -1);
10750 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
10760 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
10770 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75  jPtr);..    retu
10780 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
10790 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
107a0 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a  ata;..objc = obj
107b0 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b  c;..objv = objv;
107c0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10810 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d  . * MiscObjCmd -
10820 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a  - misc commands.
10830 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
10840 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
10850 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
10860 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
10870 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
108c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69  */.static int.Mi
108d0 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  scObjCmd(ClientD
108e0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
108f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10900 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
10910 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
10920 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69  v[]) {.    stati
10930 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
10940 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
10950 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e  eq", "strreq", N
10960 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
10970 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
10980 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d   C_STRREQ, C_DUM
10990 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d  MY };.    int cm
109a0 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68  d, isStr;.    ch
109b0 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d  ar buffer[16384]
109c0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
109d0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
109e0 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
109f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10a00 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
10a10 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
10a20 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
10a30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10a40 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
10a50 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
10a60 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
10a70 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
10a80 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43  ", 0,&cmd) != TC
10a90 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
10aa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10ab0 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63  ..    isStr = (c
10ac0 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b  md == C_STRREQ);
10ad0 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
10ae0 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29  um command) cmd)
10af0 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a   {..case C_REQ:.
10b00 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20  .case C_STRREQ: 
10b10 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20  {..    EVP_PKEY 
10b20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *pkey=NULL;..   
10b30 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c   X509 *cert=NULL
10b40 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  ;..    X509_NAME
10b50 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20   *name=NULL;..  
10b60 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74    Tcl_Obj **list
10b70 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74  v;..    int list
10b80 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  c,i;...    BIO *
10b90 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
10ba0 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
10bb0 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
10bc0 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
10bd0 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
10be0 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
10bf0 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
10c00 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
10c10 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
10c20 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50  ays=365;..#if OP
10c30 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
10c40 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
10c50 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a  0L..    BIGNUM *
10c60 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  bne = NULL;..   
10c70 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
10c80 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50  ;.#else..    EVP
10c90 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d  _PKEY_CTX *ctx =
10ca0 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09   NULL;.#endif...
10cb0 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
10cc0 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
10cd0 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
10ce0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10cf0 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
10d00 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
10d10 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
10d20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
10d30 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
10d40 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
10d50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
10d60 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
10d70 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
10d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
10d90 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
10da0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10db0 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
10dc0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
10dd0 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69  objv[4]);..    i
10de0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63  f (isStr) {...Tc
10df0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
10e00 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09  keyout,"",0);...
10e10 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
10e20 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,pemout,"",0);.
10e30 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
10e40 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66  (objc>=6) {...if
10e50 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
10e60 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
10e70 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69   objv[5],....&li
10e80 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
10e90 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
10ea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10eb0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
10ec0 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
10ed0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
10ee0 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
10ef0 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
10f00 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
10f10 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
10f20 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
10f30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
10f40 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
10f50 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
10f60 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
10f70 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
10f80 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
10f90 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
10fa0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
10fb0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
10fc0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
10fd0 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
10fe0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
10ff0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
11000 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
11010 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
11020 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
11030 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
11040 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
11050 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
11060 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
11070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
11080 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
11090 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
110a0 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
110b0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
110c0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
110d0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
110e0 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
110f0 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
11100 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
11110 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
11120 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
11130 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
11140 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
11150 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
11160 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
11170 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
11180 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
11190 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
111a0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
111b0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
111c0 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
111d0 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
111e0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
111f0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
11200 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
11210 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
11220 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11230 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11240 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
11250 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
11260 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
11270 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
11280 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
11290 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
112a0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
112b0 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
112c0 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
112d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
112e0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
112f0 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
11300 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
11310 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
11320 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
11330 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
11340 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
11350 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
11360 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
11370 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
11380 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
11390 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
113a0 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
113b0 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
113c0 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
113d0 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
113e0 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
113f0 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
11400 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
11410 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
11420 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
11430 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
11440 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
11450 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
11460 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
11470 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
11480 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
11490 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
114a0 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
114b0 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
114c0 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
114d0 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
114e0 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
114f0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
11500 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
11510 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
11520 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
11530 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
11540 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
11550 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
11560 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
11570 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
11580 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
11590 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
115a0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
115b0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
115c0 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
115d0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
115e0 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
115f0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
11600 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
11610 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
11620 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
11630 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
11640 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
11650 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
11660 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
11670 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
11680 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
11690 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
116a0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
116b0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
116c0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
116d0 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
116e0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
116f0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
11700 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
11710 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
11720 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
11730 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
11740 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
11750 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
11760 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
11770 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
11780 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
11790 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
117a0 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
117b0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
117c0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
117d0 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
117e0 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
117f0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
11800 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
11810 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
11820 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
11830 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
11840 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
11850 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
11860 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
11870 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
11880 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
11890 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
118a0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
118b0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
118c0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
118d0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
118e0 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f   return(TCL_ERRO
118f0 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  R);...}....X509_
11900 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74  set_version(cert
11910 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45  ,2);...ASN1_INTE
11920 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74  GER_set(X509_get
11930 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65  _serialNumber(ce
11940 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58  rt),serial);...X
11950 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
11960 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f  509_getm_notBefo
11970 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
11980 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
11990 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65  509_getm_notAfte
119a0 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30  r(cert),(long)60
119b0 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09  *60*24*days);...
119c0 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28  X509_set_pubkey(
119d0 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e  cert,pkey);....n
119e0 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62  ame=X509_get_sub
119f0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b  ject_name(cert);
11a00 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ....X509_NAME_ad
11a10 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
11a20 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e  ame,"C", MBSTRIN
11a30 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
11a40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
11a50 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _C, -1, -1, 0);.
11a60 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
11a70 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
11a80 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47  e,"ST", MBSTRING
11a90 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
11aa0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
11ab0 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  ST, -1, -1, 0);.
11ac0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
11ad0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
11ae0 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"L", MBSTRING_
11af0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
11b00 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c  gned char *) k_L
11b10 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
11b20 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
11b30 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
11b40 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "O", MBSTRING_AS
11b50 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
11b60 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20  ed char *) k_O, 
11b70 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
11b80 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
11b90 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
11ba0 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  U", MBSTRING_ASC
11bb0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
11bc0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20  d char *) k_OU, 
11bd0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
11be0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
11bf0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
11c00 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  N", MBSTRING_ASC
11c10 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
11c20 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20  d char *) k_CN, 
11c30 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
11c40 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
11c50 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45  y_by_txt(name,"E
11c60 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  mail", MBSTRING_
11c70 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
11c80 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45  gned char *) k_E
11c90 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  mail, -1, -1, 0)
11ca0 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75  ;....X509_set_su
11cb0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c  bject_name(cert,
11cc0 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58  name);....if (!X
11cd0 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b  509_sign(cert,pk
11ce0 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29  ey,EVP_sha256())
11cf0 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66  ) {...    X509_f
11d00 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20  ree(cert);...   
11d10 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
11d20 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
11d30 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
11d40 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
11d50 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
11d60 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
11d70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
11d80 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e  terp,"Error sign
11d90 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22  ing certificate"
11da0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
11db0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11dc0 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72  ..}....if (isStr
11dd0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
11de0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
11df0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
11e00 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
11e10 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d  ,cert);...    i=
11e20 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
11e30 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
11e40 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
11e50 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
11e60 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
11e70 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
11e80 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
11e90 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
11ea0 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
11eb0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
11ec0 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
11ed0 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
11ee0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
11ef0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
11f00 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
11f10 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20  t,pemout);...   
11f20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58   PEM_write_bio_X
11f30 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09  509(out,cert);..
11f40 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c  .    BIO_free_al
11f50 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58  l(out);...}....X
11f60 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
11f70 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
11f80 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
11f90 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
11fa0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
11fb0 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
11fc0 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d  #endif..    }..}
11fd0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ..break;.    def
11fe0 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20  ault:..break;.  
11ff0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
12000 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
12010 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
12020 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
12040 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
12050 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
12070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120b0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
120c0 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
120d0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
120e0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
120f0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
12100 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
12110 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
12120 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
12130 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
12140 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
12150 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
12160 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
12170 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
12180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121c0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
121d0 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b  Free(char *block
121e0 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
121f0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
12200 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
12210 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
12220 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
12230 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
12240 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
12250 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
12260 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
122a0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
122b0 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
122c0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
122d0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
122e0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
122f0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
12300 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
12310 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
12320 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
12330 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
12340 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
12350 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
12360 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
12370 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
12380 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
12390 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
123a0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
123b0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
123c0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
123d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
123e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12410 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
12420 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
12430 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
12440 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12450 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
12460 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
12470 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
12480 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
12490 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
124a0 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
124b0 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
124c0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
124d0 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
124e0 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
124f0 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
12500 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
12510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
12520 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
12530 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
12540 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
12550 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
12560 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
12570 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
12580 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
12590 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
125a0 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
125b0 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
125c0 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
125d0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
125e0 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
125f0 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
12600 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
12610 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
12620 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
12630 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
12640 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
12650 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
12660 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
12670 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
12680 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
12690 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
126a0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
126b0 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
126c0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
126d0 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
126e0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
126f0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
12700 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
12710 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
12720 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
12730 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
12740 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
12750 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
12760 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
12770 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
12780 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
12790 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
127a0 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
127b0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
127c0 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
127d0 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ng");.}.../*. *-
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12820 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69  --. *. * Tls_Ini
12830 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
12840 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
12850 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
12860 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20  edure, which is 
12870 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c  called. *.by Tcl
12880 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61   when this packa
12890 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65  ge is to be adde
128a0 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65  d to an interpre
128b0 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
128c0 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75  ts:  Ssl configu
128d0 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20  red and loaded. 
128e0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
128f0 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68  s:. *. create th
12900 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69  e ssl command, i
12910 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f  nitialize ssl co
12920 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ntext. *. *-----
12930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12970 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74  */.DLLEXPORT int
12980 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e   Tls_Init(Tcl_In
12990 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
129a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74      const char t
129b0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b  lsTclInitScript[
129c0 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ] = {.#include "
129d0 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30  tls.tcl.h"..0x00
129e0 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72  .    };..    dpr
129f0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
12a00 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
12a10 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54  e only support T
12a20 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a  cl 8.4 or newer.
12a30 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
12a40 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f  .#ifdef USE_TCL_
12a50 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53  STUBS..Tcl_InitS
12a60 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
12a70 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63  4", 0).#else..Tc
12a80 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
12a90 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34  erp, "Tcl", "8.4
12aa0 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20  -", 0).#endif.. 
12ab0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
12ac0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12ad0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73    }..    if (Tls
12ae0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
12af0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
12b00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12b10 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
12b20 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
12b30 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ary", NULL);..re
12b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12b50 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
12b60 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
12b70 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69  interp, "tls::ci
12b80 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f  phers", CiphersO
12b90 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
12ba0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
12bb0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
12bc0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
12bd0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
12be0 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65  erp, "tls::conne
12bf0 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69  ction", Connecti
12c00 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43  onInfoObjCmd, (C
12c10 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
12c20 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
12c30 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
12c40 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
12c50 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
12c60 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61  ::handshake", Ha
12c70 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28  ndshakeObjCmd, (
12c80 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
12c90 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
12ca0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
12cb0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
12cc0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
12cd0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f  s::import", Impo
12ce0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
12cf0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
12d00 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
12d10 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
12d20 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
12d30 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e  interp, "tls::un
12d40 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
12d50 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
12d60 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
12d70 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
12d80 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
12d90 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
12da0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61  nterp, "tls::sta
12db0 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43  tus", StatusObjC
12dc0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
12dd0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
12de0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
12df0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
12e00 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
12e10 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22  , "tls::version"
12e20 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c  , VersionObjCmd,
12e30 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
12e40 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
12e50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
12e60 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
12e70 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
12e80 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63  tls::misc", Misc
12e90 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
12ea0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
12eb0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
12ec0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
12ed0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
12ee0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74  terp, "tls::prot
12ef0 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c  ocols", Protocol
12f00 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
12f10 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
12f20 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
12f30 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69  ULL);..    if (i
12f40 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76  nterp) {..Tcl_Ev
12f50 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63  al(interp, tlsTc
12f60 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20  lInitScript);.  
12f70 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28    }..    return(
12f80 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
12f90 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41  nterp, "tls", PA
12fa0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b  CKAGE_VERSION));
12fb0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
12ff0 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49  . *. *.Tls_SafeI
13000 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
13040 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65  *.Standard proce
13050 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79  dure required by
13060 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74   'load'.. *.Init
13070 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74  ializes this ext
13080 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66  ension for a saf
13090 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  e interpreter.. 
130a0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130d0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
130e0 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f  ffects:. *..As o
130f0 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
13100 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
13110 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72   standard Tcl er
13120 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ror code.. *. *-
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58  -----*. */.DLLEX
13170 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66  PORT int Tls_Saf
13180 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
13190 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
131a0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
131b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c  );.    return(Tl
131c0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b  s_Init(interp));
131d0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
13210 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69  . *. *.TlsLibIni
13220 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
13260 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  Initializes SSL 
13270 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72  library once per
13280 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09   application. *.
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132c0 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66  *. *. *.Side eff
132d0 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61  ects:. *..initia
132e0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
132f0 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  y. *. *.Result:.
13300 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d   *..none. *. *--
13310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
13350 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28   int TlsLibInit(
13360 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
13370 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ) {.    static i
13380 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  nt initialized =
13390 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74   0;.    int stat
133a0 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66  us = TCL_OK;.#if
133b0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
133c0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
133d0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
133e0 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d  ).    size_t num
133f0 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a  _locks;.#endif..
13400 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61      if (uninitia
13410 6c 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 20 20  lize) {.        
13420 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64  if (!initialized
13430 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
13440 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
13450 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20  o uninitialize, 
13460 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69  but we are not i
13470 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20  nitialized");.. 
13480 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13490 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20  n(TCL_OK);.     
134a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 70     }..        dp
134b0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
134c0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
134d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
134e0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
134f0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
13500 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54 63  EADS).        Tc
13510 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
13520 74 5f 6d 78 29 3b 0a 0a 20 20 20 20 20 20 20 20  t_mx);..        
13530 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20  if (locks) {.   
13540 20 20 20 20 20 20 20 20 20 66 72 65 65 28 6c 6f           free(lo
13550 63 6b 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  cks);.          
13560 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a    locks = NULL;.
13570 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
13580 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  sCount = 0;.    
13590 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
135a0 20 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64       initialized
135b0 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 0;..#if defin
135c0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
135d0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
135e0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
135f0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c      Tcl_MutexUnl
13600 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
13610 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 72  endif..        r
13620 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20  eturn(TCL_OK);. 
13630 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
13640 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20  itialized) {.   
13650 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61       dprintf("Ca
13660 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20  lled, but using 
13670 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a  cached value");.
13680 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 73          return(s
13690 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  tatus);.    }.. 
136a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
136b0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
136c0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
136d0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
136e0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
136f0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
13700 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
13710 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
13720 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 1;..#if define
13730 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
13740 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
13750 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e  L_THREADS).    n
13760 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20  um_locks = 1;.  
13770 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28    locksCount = (
13780 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  int) num_locks;.
13790 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c      locks = mall
137a0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  oc(sizeof(*locks
137b0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
137c0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73      memset(locks
137d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63  , 0, sizeof(*loc
137e0 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
137f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
13800 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48   Initialize BOTH
13810 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c   libcrypto and l
13820 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50  ibssl. */.    OP
13830 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f  ENSSL_init_ssl(O
13840 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
13850 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f  _SSL_STRINGS | O
13860 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
13870 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a  _CRYPTO_STRINGS.
13880 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  .| OPENSSL_INIT_
13890 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20  ADD_ALL_CIPHERS 
138a0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
138b0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20  DD_ALL_DIGESTS, 
138c0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
138d0 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29  new_tcl(NULL, 0)
138e0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a  ;..#if 0.    /*.
138f0 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a       * XXX:TODO:
13900 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64   Remove this cod
13910 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  e and replace it
13920 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20   with a check.  
13930 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20     * for enough 
13940 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e  entropy and do n
13950 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ot try to create
13960 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20   our own.     * 
13970 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79  terrible entropy
13980 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a  .     */.    /*.
13990 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20       * Seed the 
139a0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
139b0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53  nerator in the S
139c0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20  SL library,.    
139d0 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f   * using the do/
139e0 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20  while construct 
139f0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62  because of the b
13a00 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20  ug note in the. 
13a10 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41      * OpenSSL FA
13a20 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  Q at http://www.
13a30 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70  openssl.org/supp
13a40 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45  ort/faq.html#USE
13a50 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  R1.     *.     *
13a60 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65   The crux of the
13a70 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74   problem is that
13a80 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20   Solaris 7 does 
13a90 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20  not have a.     
13aa0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72  * /dev/random or
13ab0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65   /dev/urandom de
13ac0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f  vice so it canno
13ad0 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a  t gather enough.
13ae0 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66       * entropy f
13af0 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65  rom the RAND_see
13b00 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69  d() when TLS ini
13b10 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66  tializes and ref
13b20 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67  uses.     * to g
13b30 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69  o further. Earli
13b40 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f  er versions of O
13b50 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f  penSSL carried o
13b60 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  n regardless..  
13b70 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28     */.    srand(
13b80 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
13b90 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e  ime((time_t *) N
13ba0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a  ULL));.    do {.
13bb0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
13bc0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20   16; i++) {..   
13bd0 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31   rnd_seed[i] = 1
13be0 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30   + (char) (255.0
13bf0 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f   * rand()/(RAND_
13c00 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52  MAX+1.0));..}..R
13c10 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65  AND_seed(rnd_see
13c20 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65  d, sizeof(rnd_se
13c30 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c  ed));.    } whil
13c40 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29  e (RAND_status()
13c50 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a   != 1);.#endif..
13c60 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
13c70 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
13c80 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
13c90 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55  ADS)..Tcl_MutexU
13ca0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  nlock(&init_mx);
13cb0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e  .#endif...return
13cc0 28 73 74 61 74 75 73 29 3b 0a 7d 0a              (status);.}.