Hex Artifact Content

Artifact 30923f52a98f56e35f31c5c7d130bbc57f609d7afce645e62b79e7a9871639bb:


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 28 63  e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a  har *)0;.    }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76  .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49  flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20  ER_CERT) {..    
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c  return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20   1;..}.    }.   
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20  verify", -1));. 
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
19d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
19e0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
19f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
1a00: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
1a10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1a20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1a30: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1a40: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
1a50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1a60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1a70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
1a80: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
1a90: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
1aa0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1ab0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1ac0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1ad0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
1ae0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1af0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1b00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1b10: 77 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74  wStringObj(errSt
1b20: 72 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c  r ? errStr : "",
1b30: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
1b40: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
1b50: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
1b60: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
1b70: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
1b80: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61  tePtr);..    sta
1b90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
1ba0: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
1bb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
1bc0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
1bd0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
1be0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
1bf0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
1c00: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
1c10: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
1c20: 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 6f 74  OK) {../* It got
1c30: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65   an error - reje
1c40: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ct the certifica
1c50: 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28 54 43 4c  te...*/.#if (TCL
1c60: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
1c70: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
1c80: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
1c90: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
1ca0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
1cb0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
1cc0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
1cd0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
1ce0: 69 66 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20 20 20  if..ok = 0;.    
1cf0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74  } else {..result
1d00: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
1d10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 73 74  ult(interp);..st
1d20: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  ring = Tcl_GetSt
1d30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75  ringFromObj(resu
1d40: 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f  lt, &length);../
1d50: 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75 6c  * An empty resul
1d60: 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69 63  t leaves verific
1d70: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
1d80: 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67 20  .*/..if (string 
1d90: 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74  != NULL && lengt
1da0: 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63 6f  h > 0) {..    co
1db0: 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46  de = Tcl_GetIntF
1dc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
1dd0: 65 73 75 6c 74 2c 20 26 6f 6b 29 3b 0a 09 20 20  esult, &ok);..  
1de0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
1df0: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
1e00: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
1e10: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
1e20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
1e30: 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
1e40: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
1e50: 65 6c 73 65 0a 09 09 54 63 6c 5f 42 61 63 6b 67  else...Tcl_Backg
1e60: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
1e70: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
1e80: 6e 64 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09  ndif...ok = 0;..
1e90: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20      }..}.    }. 
1ea0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1eb0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20  unt(cmdPtr);..  
1ec0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
1ed0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43  s &= ~(TLS_TCL_C
1ee0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54  ALLBACK);..    T
1ef0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
1f00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
1f10: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
1f20: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
1f30: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
1f40: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64  urn(ok);./* By d
1f50: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65  efault, leave ve
1f60: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61  rification uncha
1f70: 6e 67 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a  nged..*/.}.../*.
1f80: 20 2a 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 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
1fd0: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43  Error --. *. *.C
1fe0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  alls callback wi
1ff0: 74 68 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20  th $fd and $msg 
2000: 2d 20 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  - so the callbac
2010: 6b 20 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09  k can decide. *.
2020: 77 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  what to do with 
2030: 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69  errors.. *. * Si
2040: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
2050: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
2060: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
2070: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
2080: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
2090: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
20a0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
20b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
20c0: 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  son. *----------
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
2110: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61  id.Tls_Error(Sta
2120: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68  te *statePtr, ch
2130: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54  ar *msg) {.    T
2140: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2150: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
2160: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
2170: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
2180: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70  nt code;..    dp
2190: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
21a0: 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 20 26 26  ..    if (msg &&
21b0: 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65   *msg) {..Tcl_Se
21c0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
21d0: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28  p, "SSL", msg, (
21e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20  char *)NULL);.  
21f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20    } else {..msg 
2200: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
2210: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  romObj(Tcl_GetOb
2220: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  jResult(interp),
2230: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20   NULL);.    }.  
2240: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
2250: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28  = msg;..    if (
2260: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
2270: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
2280: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
2290: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69  f[BUFSIZ];..spri
22a0: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68  ntf(buf, "SSL ch
22b0: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72  annel \"%s\": er
22c0: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54  ror: %s",..    T
22d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
22e0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
22f0: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65  ), msg);..Tcl_Se
2300: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2310: 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  buf, TCL_VOLATIL
2320: 45 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  E);.#if (TCL_MAJ
2330: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
2340: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
2350: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
2360: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2370: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
2380: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
2390: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
23a0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e   TCL_ERROR);.#en
23b0: 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  dif..return;.   
23c0: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20   }.    cmdPtr = 
23d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
23e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
23f0: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  ack);..    Tcl_L
2400: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2410: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2420: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2430: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31  gObj("error", -1
2440: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2450: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2460: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2470: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
2480: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
2490: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
24a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
24b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
24c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
24d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
24e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
24f0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  sg, -1));..    T
2500: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
2510: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
2520: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
2530: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
2540: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
2550: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2560: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
2570: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
2580: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
2590: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
25a0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
25b0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
25c0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
25d0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
25e0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
25f0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
2600: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
2610: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
2620: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
2630: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
2640: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
2650: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2660: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
2670: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
2680: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
2690: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65  Ptr);.    Tcl_Re
26a0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
26b0: 61 29 20 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a  a) interp);.}...
26c0: 2f 2a 0a 20 2a 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 2d  ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b  --------. *. * K
2710: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d  eyLogCallback --
2720: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63  . *. *.Write rec
2730: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74  eived key data t
2740: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20  o log file.. *. 
2750: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2760: 20 2a 09 6e 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d   *.none. *------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
27b0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
27c0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
27d0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
27e0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
27f0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
2800: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
2810: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20  .    FILE *fd;. 
2820: 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66     if (str) {..f
2830: 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22  d = fopen(str, "
2840: 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64  a");..fprintf(fd
2850: 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a  , "%s\n",line);.
2860: 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  .fclose(fd);.   
2870: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
28c0: 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61   *. * PasswordCa
28d0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
28e0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61  Called when a pa
28f0: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64  ssword is needed
2900: 20 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61   to unpack RSA a
2910: 6e 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09  nd PEM keys.. *.
2920: 45 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20  Evals any bound 
2930: 70 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20  password script 
2940: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
2950: 72 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65  result as. *.the
2960: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
2970: 2e 0a 20 2a 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 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
29c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
29d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
29e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
29f0: 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75   verify, void *u
2a00: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74  data) {.    Stat
2a10: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
2a20: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20  tate *) udata;. 
2a30: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
2a40: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
2a50: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
2a60: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
2a70: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20     int code;..  
2a80: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2a90: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
2aa0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
2ab0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
2ac0: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
2ad0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
2ae0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
2af0: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
2b00: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
2b10: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
2b20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
2b30: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20  sult(interp);.. 
2b40: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
2b50: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
2b60: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
2b70: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74   (int)strlen(ret
2b80: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
2b90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
2ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74      }..    cmdPt
2bb0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2bc0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
2bd0: 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54  assword);..    T
2be0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
2bf0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
2c00: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
2c10: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
2c20: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
2c30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2c40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
2c50: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
2c60: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
2c70: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
2c80: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
2c90: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
2ca0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
2cb0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
2cc0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
2cd0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
2ce0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
2cf0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
2d00: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
2d10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
2d20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
2d30: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2d40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2d50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
2d60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
2d70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28  ePtr);..    if (
2d80: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20  code == TCL_OK) 
2d90: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28  {..char *ret = (
2da0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
2db0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
2dc0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e  rp);..if (strlen
2dd0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31  (ret) < size - 1
2de0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79  ) {..    strncpy
2df0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
2e00: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20  _t) size);..    
2e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
2e20: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
2e30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
2e40: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a  nt)strlen(ret);.
2e50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  .}.    }.    Tcl
2e60: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
2e70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
2e80: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76     return -1;..v
2e90: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a  erify = verify;.
2ea0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2ef0: 20 2a 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61   * SessionCallba
2f00: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d  ck for Clients -
2f10: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
2f20: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  hen a new sessio
2f30: 6e 20 74 69 63 6b 65 74 20 68 61 73 20 62 65 65  n ticket has bee
2f40: 6e 20 72 65 63 65 69 76 65 64 2e 20 49 6e 20 54  n received. In T
2f50: 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d  LS 1.3. *.this m
2f60: 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d  ay be received m
2f70: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66  ultiple times af
2f80: 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ter the handshak
2f90: 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65  e. For. *.earlie
2fa0: 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73  r versions, this
2fb0: 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65   will be receive
2fc0: 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e  d during the han
2fd0: 64 73 68 61 6b 65 2e 0a 20 2a 0a 20 2a 20 52 65  dshake.. *. * Re
2fe0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
2ff0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3000: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
3010: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
3020: 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3070: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61  ic int.SessionCa
3080: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3090: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
30a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
30b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
30c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
30d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
30e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
30f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3100: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
3110: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
3120: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
3130: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3140: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
3150: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3160: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
3170: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
3180: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
3190: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 0a 20 20  size_t len2;..  
31a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
31b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
31c0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
31d0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
31e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a  LL)..return 0;..
31f0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3200: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3210: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3220: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
3230: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3240: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3250: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3260: 6a 28 20 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31  j( "session", -1
3270: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
3280: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65  ion id */.    se
3290: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
32a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63  ESSION_get0_id_c
32b0: 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20  ontext(session, 
32c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  &len);.    Tcl_L
32d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
32e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
32f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3300: 67 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c  gObj(session_id,
3310: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
3320: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
3330: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
3340: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
3350: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
3360: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
3370: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3380: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3390: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
33a0: 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69  ngObj(ticket, (i
33b0: 6e 74 29 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20  nt)len2));..    
33c0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75  /* Lifetime - nu
33d0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
33e0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
3410: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28  .Tcl_NewLongObj(
3420: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49  (long) SSL_SESSI
3430: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
3440: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
3450: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 54 63 6c  ion)));..    Tcl
3460: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3470: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3480: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3490: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
34a0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  atePtr);..    Tc
34b0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
34c0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65  mdPtr);.    code
34d0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
34e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
34f0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3500: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
3510: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66  != TCL_OK) {.#if
3520: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
3530: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
3540: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
3550: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
3560: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
3570: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61  );.#else..Tcl_Ba
3580: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f  ckgroundExceptio
3590: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  n(interp, code);
35a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
35b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
35c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
35d0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
35e0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
35f0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
3600: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
3610: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
3620: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a  eturn 1;.}.../*.
3630: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e  -----. *. * ALPN
3680: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
3690: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 53  rvers --. *. *.S
36a0: 65 6c 65 63 74 20 77 68 69 63 68 20 70 72 6f 74  elect which prot
36b0: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
36c0: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 74 6f  h2, h3, etc.) to
36d0: 20 75 73 65 20 66 6f 72 20 74 68 65 0a 20 2a 09   use for the. *.
36e0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74  incoming connect
36f0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
3700: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
3710: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3720: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
3730: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
3740: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
3750: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
3760: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72  _ERR_OK: ALPN pr
3770: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
3780: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
3790: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
37a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
37b0: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20  RT_FATAL: There 
37c0: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62  was no overlap b
37d0: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e  etween the clien
37e0: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c  t's. *.    suppl
37f0: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ied list and the
3800: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72   server configur
3810: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ation. The conne
3820: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62  ction will be ab
3830: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c  orted.. *.SSL_TL
3840: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
3850: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  ALPN protocol no
3860: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e  t selected, e.g.
3870: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50  , because no ALP
3880: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f  N. *.    protoco
3890: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  ls are configure
38a0: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65  d for this conne
38b0: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ction. The conne
38c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
38d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
3920: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c  atic int.ALPNCal
3930: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
3940: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69  *ssl, const unsi
3950: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c  gned char **out,
3960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3970: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75  outlen,..const u
3980: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e  nsigned char *in
3990: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69  , unsigned int i
39a0: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29  nlen, void *arg)
39b0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
39c0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
39d0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
39e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
39f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3a00: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3a10: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3a20: 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  de;..    dprintf
3a30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3a40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
3a50: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
3a60: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
3a70: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
3a80: 52 5f 4f 4b 3b 0a 0a 20 20 20 20 63 6d 64 50 74  R_OK;..    cmdPt
3a90: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3aa0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
3ab0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54  allback);..    T
3ac0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3ad0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3ae0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3af0: 74 72 69 6e 67 4f 62 6a 28 20 22 61 6c 70 6e 22  tringObj( "alpn"
3b00: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
3b10: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3b20: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3b30: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3b40: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
3b50: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  atePtr);..    Tc
3b60: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
3b70: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65  mdPtr);.    code
3b80: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
3b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3ba0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3bb0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
3bc0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66  != TCL_OK) {.#if
3bd0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
3be0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
3bf0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
3c00: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
3c10: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
3c20: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61  );.#else..Tcl_Ba
3c30: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f  ckgroundExceptio
3c40: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  n(interp, code);
3c50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
3c60: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3c70: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
3c80: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
3c90: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
3ca0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
3cb0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
3cc0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
3cd0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
3ce0: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a  _ERR_OK;.}.../*.
3cf0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20  -----. *. * SNI 
3d40: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72  Callback for Ser
3d50: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65  vers --. *. *.Pe
3d60: 72 66 6f 72 6d 20 73 65 72 76 65 72 20 6e 61 6d  rform server nam
3d70: 65 20 73 65 6c 65 63 74 69 6f 6e 0a 20 2a 0a 20  e selection. *. 
3d80: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
3d90: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
3da0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
3db0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
3dc0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
3dd0: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
3de0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
3df0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
3e00: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f  accepted. The co
3e10: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
3e20: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
3e30: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
3e40: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  L: SNI hostname 
3e50: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e  is not accepted.
3e60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   The connection.
3e70: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65   *.    is aborte
3e80: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61  d. Default for a
3e90: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55  lert is SSL_AD_U
3ea0: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
3eb0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
3ec0: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
3ed0: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  G: SNI hostname 
3ee0: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c  is not accepted,
3ef0: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20   warning alert. 
3f00: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20  *.    sent (not 
3f10: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65  in TLSv1.3). The
3f20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
3f30: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
3f40: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
3f50: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
3f60: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64  not accepted and
3f70: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65   not acknowledge
3f80: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69  d,. *.    e.g. i
3f90: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65  f SNI has not be
3fa0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54  en configured. T
3fb0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
3fc0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
4020: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .SNICallback(con
4030: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
4040: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
4050: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
4060: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
4070: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
4080: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
4090: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
40a0: 72 70 3b 0a 2f 2a 20 20 20 20 53 53 4c 5f 43 54  rp;./*    SSL_CT
40b0: 58 2a 20 63 74 78 3b 20 2a 2f 0a 20 20 20 20 54  X* ctx; */.    T
40c0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
40d0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
40e0: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61    char *serverna
40f0: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  me = NULL;..    
4100: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
4110: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
4120: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
4130: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4140: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4150: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4160: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73     } else if (ss
4170: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  l == NULL) {..re
4180: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4190: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
41a0: 0a 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ..    servername
41b0: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65   = SSL_get_serve
41c0: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
41d0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
41e0: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21  name);.    if (!
41f0: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65  servername || se
4200: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27  rvername[0] == '
4210: 5c 30 27 29 0a 20 20 20 20 20 20 20 20 72 65 74  \0').        ret
4220: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4230: 52 52 5f 4e 4f 41 43 4b 3b 0a 0a 20 20 20 20 2f  RR_NOACK;..    /
4240: 2a 20 55 73 65 20 53 53 4c 5f 73 65 74 5f 53 53  * Use SSL_set_SS
4250: 4c 5f 43 54 58 20 74 6f 20 63 68 61 6e 67 65 20  L_CTX to change 
4260: 74 68 65 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69  the SSL connecti
4270: 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75 73 65  on object to use
4280: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
4290: 63 6f 6e 74 65 78 74 20 63 72 65 61 74 65 64 20  context created 
42a0: 66 72 6f 6d 20 53 53 4c 5f 43 54 58 28 29 20 66  from SSL_CTX() f
42b0: 6f 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61  or the certifica
42c0: 74 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  te corresponding
42d0: 20 74 6f 2c 0a 20 20 20 20 20 20 20 74 68 65 20   to,.       the 
42e0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
42f0: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
4300: 63 6c 69 65 6e 74 2e 20 2a 2f 0a 0a 20 20 20 20  client. */..    
4310: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
4320: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
4330: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a  tr->callback);..
4340: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4350: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4360: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4370: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 22  _NewStringObj( "
4380: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  sni", -1));.    
4390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
43a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
43b0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
43c0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72  StringObj(server
43d0: 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20  name , -1));..  
43e0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
43f0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
4400: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
4410: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
4420: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
4430: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
4440: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
4450: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
4460: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
4470: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
4480: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
4490: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
44a0: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  {.#if (TCL_MAJOR
44b0: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
44c0: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
44d0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
44e0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
44f0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
4500: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
4510: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
4520: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
4530: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
4540: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
4550: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
4560: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
4570: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63  tatePtr);.    Tc
4580: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
4590: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
45a0: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
45b0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
45c0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4610: 20 48 65 6c 6c 6f 20 43 61 6c 6c 62 61 63 6b 20   Hello Callback 
4620: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
4630: 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72  *. *.Used by ser
4640: 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74  ver to examine t
4650: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69  he server name i
4660: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20  ndication (SNI) 
4670: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f  extension. *.pro
4680: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69  vided by the cli
4690: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
46a0: 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70  select an approp
46b0: 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74  riate certificat
46c0: 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c  e to. *.present,
46d0: 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20   and make other 
46e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64  configuration ad
46f0: 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61  justments releva
4700: 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65  nt to that serve
4710: 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74  r. *.name and it
4720: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  s configuration.
4730: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73   This includes s
4740: 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20  wapping out the 
4750: 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53  associated. *.SS
4760: 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d  L_CTX pointer, m
4770: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72  odifying the ser
4780: 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65  ver's list of pe
4790: 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73  rmitted TLS vers
47a0: 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e  ions,. *.changin
47b0: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63  g the server's c
47c0: 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65  ipher list in re
47d0: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c  sponse to the cl
47e0: 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69  ient's cipher li
47f0: 73 74 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a 20 52  st, etc.. *. * R
4800: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
4810: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4820: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
4830: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4840: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4850: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c  codes:. *.SSL_CL
4860: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59  IENT_HELLO_RETRY
4870: 20 3d 20 73 75 73 70 65 6e 64 20 74 68 65 20 68   = suspend the h
4880: 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68  andshake, and th
4890: 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63  e handshake func
48a0: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e  tion will return
48b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09   immediately. *.
48c0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
48d0: 5f 45 52 52 4f 52 20 3d 20 66 61 69 6c 75 72 65  _ERROR = failure
48e0: 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e  , terminate conn
48f0: 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72  ection. Set aler
4900: 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e  t to error code.
4910: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
4920: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 20 3d 20 73  ELLO_SUCCESS = s
4930: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  uccess. *. *----
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4980: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48   */.static int.H
4990: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  elloCallback(con
49a0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
49b0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
49c0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
49d0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
49e0: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
49f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
4a00: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
4a10: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
4a20: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
4a30: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69   code;..    dpri
4a40: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
4a50: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4a60: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
4a70: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72  cl_Obj*)NULL)..r
4a80: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
4a90: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
4aa0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4ab0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4ac0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4ad0: 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73  k);..    Tcl_Lis
4ae0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4af0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4b00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4b10: 62 6a 28 20 22 68 65 6c 6c 6f 22 2c 20 2d 31 29  bj( "hello", -1)
4b20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 53 4c 5f 63  );..    /* SSL_c
4b30: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30  lient_hello_get0
4b40: 5f 72 61 6e 64 6f 6d 28 29 2c 20 53 53 4c 5f 63  _random(), SSL_c
4b50: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30  lient_hello_get0
4b60: 5f 73 65 73 73 69 6f 6e 5f 69 64 28 29 2c 20 53  _session_id(), S
4b70: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  SL_client_hello_
4b80: 67 65 74 30 5f 63 69 70 68 65 72 73 28 29 2c 20  get0_ciphers(), 
4b90: 61 6e 64 20 53 53 4c 5f 63 6c 69 65 6e 74 5f 68  and SSL_client_h
4ba0: 65 6c 6c 6f 5f 67 65 74 30 5f 63 6f 6d 70 72 65  ello_get0_compre
4bb0: 73 73 69 6f 6e 5f 6d 65 74 68 6f 64 73 28 29 20  ssion_methods() 
4bc0: 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74  provide access t
4bd0: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
4be0: 69 6e 67 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  ing ClientHello 
4bf0: 66 69 65 6c 64 73 2c 20 72 65 74 75 72 6e 69 6e  fields, returnin
4c00: 67 20 74 68 65 20 66 69 65 6c 64 20 6c 65 6e 67  g the field leng
4c10: 74 68 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c  th and optionall
4c20: 79 20 73 65 74 74 69 6e 67 20 61 6e 20 6f 75 74  y setting an out
4c30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4c40: 6f 63 74 65 74 73 20 6f 66 20 74 68 61 74 20 66  octets of that f
4c50: 69 65 6c 64 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ield. */..    /*
4c60: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 53 53 4c 5f   Similarly, SSL_
4c70: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74  client_hello_get
4c80: 30 5f 65 78 74 28 29 20 70 72 6f 76 69 64 65 73  0_ext() provides
4c90: 20 61 63 63 65 73 73 20 74 6f 20 69 6e 64 69 76   access to indiv
4ca0: 69 64 75 61 6c 20 65 78 74 65 6e 73 69 6f 6e 73  idual extensions
4cb0: 20 66 72 6f 6d 20 74 68 65 20 43 6c 69 65 6e 74   from the Client
4cc0: 48 65 6c 6c 6f 20 6f 6e 20 61 20 70 65 72 2d 65  Hello on a per-e
4cd0: 78 74 65 6e 73 69 6f 6e 20 62 61 73 69 73 2e 20  xtension basis. 
4ce0: 46 6f 72 20 74 68 65 20 70 72 6f 76 69 64 65 64  For the provided
4cf0: 20 77 69 72 65 20 70 72 6f 74 6f 63 6f 6c 20 65   wire protocol e
4d00: 78 74 65 6e 73 69 6f 6e 20 74 79 70 65 20 76 61  xtension type va
4d10: 6c 75 65 2c 20 74 68 65 20 65 78 74 65 6e 73 69  lue, the extensi
4d20: 6f 6e 20 76 61 6c 75 65 20 61 6e 64 20 6c 65 6e  on value and len
4d30: 67 74 68 20 61 72 65 20 72 65 74 75 72 6e 65 64  gth are returned
4d40: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 70   in the output p
4d50: 61 72 61 6d 65 74 65 72 73 20 28 69 66 20 70 72  arameters (if pr
4d60: 65 73 65 6e 74 29 2e 20 2a 2f 0a 0a 0a 20 20 20  esent). */...   
4d70: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
4d80: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
4d90: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
4da0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
4db0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
4dc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4dd0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
4de0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
4df0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
4e00: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
4e10: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
4e20: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode != TCL_OK) {
4e30: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
4e40: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
4e50: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
4e60: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
4e70: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
4e80: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
4e90: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
4ea0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
4eb0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
4ec0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
4ed0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4ee0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
4ef0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
4f00: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
4f10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
4f20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
4f30: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c     return SSL_CL
4f40: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
4f50: 53 53 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  SS;.}.../*******
4f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
4f70: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20  * Commands      
4f80: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
4fa0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
4ff0: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
5000: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
5010: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
5020: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
5030: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
5040: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
5050: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
5060: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
5070: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
5080: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
5090: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
50a0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
50b0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
50c0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
50d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
50e0: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
50f0: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
5100: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5150: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5160: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
5170: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22  ] = {.."ssl2", "
5180: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
5190: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
51a0: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
51b0: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
51c0: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
51d0: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
51e0: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
51f0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
5200: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
5210: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
5220: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
5230: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
5240: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
5250: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
5260: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
5270: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
5280: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
5290: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tr = NULL;.    S
52a0: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
52b0: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  LL;.    SSL *ssl
52c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41   = NULL;.    STA
52d0: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52  CK_OF(SSL_CIPHER
52e0: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20  ) *sk;.    char 
52f0: 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d  *cp, buf[BUFSIZ]
5300: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
5310: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
5320: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
5330: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
5340: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
5350: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20   ((objc < 2) || 
5360: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54  (objc > 4)) {..T
5370: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5380: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
5390: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62   "protocol ?verb
53a0: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f  ose? ?supported?
53b0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
53c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
53d0: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
53e0: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
53f0: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63   objv[1], protoc
5400: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  ols, "protocol",
5410: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
5420: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
5430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5440: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
5450: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 2) && Tcl_GetB
5460: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
5470: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
5480: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f  verbose) != TCL_
5490: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
54a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
54b0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33     if ((objc > 3
54c0: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
54d0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
54e0: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65  p, objv[3], &use
54f0: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54  _supported) != T
5500: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
5510: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5520: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  }..    switch ((
5530: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e  enum protocol)in
5540: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53  dex) {..case TLS
5550: 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53  _SSL2:.#if OPENS
5560: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
5570: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c  R >= 0x10100000L
5580: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   || defined(NO_S
5590: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL2) || defined(
55a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
55b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
55c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
55d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
55e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
55f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
5600: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
5610: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
5620: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
5630: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65  CTX_new(SSLv2_me
5640: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
5650: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
5660: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
5670: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
5680: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5690: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
56a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
56b0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  L3_METHOD)..    
56c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
56d0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
56e0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
56f0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
5700: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
5710: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5720: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
5730: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
5740: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29  w(SSLv3_method()
5750: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
5760: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a  ..case TLS_TLS1:
5770: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
5780: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
5790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
57a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
57b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
57c0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
57d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
57e0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
57f0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
5800: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
5810: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
5820: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
5830: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20  else..    ctx = 
5840: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
5850: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  1_method()); bre
5860: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
5870: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66   TLS_TLS1_1:.#if
5880: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
5890: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
58a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
58b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
58c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
58d0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
58e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
58f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
5900: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
5910: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
5920: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
5930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5940: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20  .#else..    ctx 
5950: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c  = SSL_CTX_new(TL
5960: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b  Sv1_1_method());
5970: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
5980: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a  case TLS_TLS1_2:
5990: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
59a0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
59b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
59c0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
59d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
59e0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _2_METHOD)..    
59f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5a00: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
5a10: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
5a20: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
5a30: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
5a40: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5a50: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
5a60: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
5a70: 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64  w(TLSv1_2_method
5a80: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
5a90: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
5aa0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_3:.#if defined
5ab0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
5ac0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5ad0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54  O_TLS1_3)..    T
5ae0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5af0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
5b00: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
5b10: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
5b20: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
5b30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5b40: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63  OR;.#else..    c
5b50: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
5b60: 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a  (TLS_method());.
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f              SSL_
5b80: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
5b90: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
5ba0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
5bb0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
5bc0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
5bd0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
5be0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72  ERSION);..    br
5bf0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  eak;.#endif..def
5c00: 61 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b  ault:..    break
5c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
5c20: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx == NULL) {..
5c30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5c40: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28  (interp, REASON(
5c50: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ), NULL);..retur
5c60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5c70: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53   }..    ssl = SS
5c80: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20  L_new(ctx);.    
5c90: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
5ca0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
5cb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41  sult(interp, REA
5cc0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53  SON(), NULL);..S
5cd0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
5ce0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5cf0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5d00: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20  /* Use list and 
5d10: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62  order as would b
5d20: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65  e sent in a Clie
5d30: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61  ntHello or all a
5d40: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
5d50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f   */.    if (use_
5d60: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b  supported) {..sk
5d70: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70   = SSL_get1_supp
5d80: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73  orted_ciphers(ss
5d90: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
5da0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63  ..sk = SSL_get_c
5db0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
5dc0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21   }..    if (sk !
5dd0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21  = NULL) {..if (!
5de0: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20  verbose) {..    
5df0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
5e00: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
5e10: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
5e20: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
5e30: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
5e40: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
5e50: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
5e60: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
5e70: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
5e80: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
5e90: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
5ea0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
5eb0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
5ec0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
5ed0: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
5ee0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
5ef0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
5f00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5f10: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
5f20: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
5f30: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20  1));..    }...} 
5f40: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50  else {..    objP
5f50: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
5f60: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20  ngObj("",0);..  
5f70: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
5f80: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50  ; i < sk_SSL_CIP
5f90: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b  HER_num(sk); i++
5fa0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f  ) {...const SSL_
5fb0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53  CIPHER *c = sk_S
5fc0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
5fd0: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20  sk, i);...if (c 
5fe0: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75  == NULL) continu
5ff0: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c  e;..../* textual
6000: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
6010: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09  the cipher */...
6020: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
6030: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75  escription(c, bu
6040: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
6050: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  != NULL) {...   
6060: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
6070: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69  (objPtr, buf, (i
6080: 6e 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29  nt) strlen(buf))
6090: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
60a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f     Tcl_AppendToO
60b0: 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e  bj(objPtr, "UNKN
60c0: 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a  OWN\n", 8);...}.
60d0: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75  .    }..}..if (u
60e0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
60f0: 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48  .    sk_SSL_CIPH
6100: 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a  ER_free(sk);..}.
6110: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72      }.    SSL_fr
6120: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c  ee(ssl);.    SSL
6130: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
6140: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
6150: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
6160: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
6170: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
6180: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
6190: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73  . *. * Protocols
61f0: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61  ObjCmd -- list a
6200: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f  vailable protoco
6210: 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  ls. *. *.This pr
6220: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
6230: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
6240: 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c  e "tls::protocol
6250: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
6260: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
6270: 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a  protocols.. *. *
6280: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6290: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
62a0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
62b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
62c0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6310: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f  /.static int.Pro
6320: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69  tocolsObjCmd(Cli
6330: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
6340: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
6350: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
6360: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
6370: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
6380: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
6390: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
63a0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
63b0: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54  (objc != 1) {..T
63c0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
63d0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
63e0: 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43   "");..return TC
63f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6400: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
6410: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
6420: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
6430: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
6440: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
6450: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
6460: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
6470: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
6480: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
6490: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
64a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
64b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
64c0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
64d0: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
64e0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
64f0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
6500: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
6510: 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  SL3).    Tcl_Lis
6520: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6530: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
6540: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6550: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
6560: 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL3], -1));.#e
6570: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
6580: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
6590: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
65a0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f  O_TLS1).    Tcl_
65b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
65c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
65d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
65e0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
65f0: 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b  TLS_TLS1], -1));
6600: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
6610: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
6620: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
6630: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
6640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6660: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
6670: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
6680: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
6690: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#endif
66a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
66b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
66c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
66d0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f  TLS1_2).    Tcl_
66e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
66f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
6700: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
6710: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
6720: 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29  TLS_TLS1_2], -1)
6730: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
6740: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
6750: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
6760: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
6770: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6780: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6790: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
67a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
67b0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
67c0: 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_3], -1));.#end
67d0: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  if..    Tcl_SetO
67e0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
67f0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
6800: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
6810: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
6820: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6870: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
6880: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
6890: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
68a0: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
68b0: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
68c0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
68d0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
68e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
68f0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
6900: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
6910: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
6920: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
6930: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
6940: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
6950: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
6960: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
6970: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
6980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
69c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
69d0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
69e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
69f0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
6a00: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
6a10: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
6a20: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
6a30: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
6a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
6a50: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
6a60: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
6a70: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
6a80: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
6a90: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
6aa0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
6ab0: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
6ac0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
6ad0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
6ae0: 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20  t err = 0;..    
6af0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6b00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
6b10: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
6b20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6b30: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
6b40: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28  nnel");..return(
6b50: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
6b60: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
6b70: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
6b80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
6b90: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
6ba0: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b  ], NULL), NULL);
6bb0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
6bc0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
6bd0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54  ULL) {..return(T
6be0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
6bf0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
6c00: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
6c10: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
6c20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
6c30: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
6c40: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
6c50: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
6c60: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
6c70: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
6c80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
6c90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
6ca0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
6cb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
6cc0: 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20  ame(chan), "\": 
6cd0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
6ce0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  l", NULL);..retu
6cf0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
6d00: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
6d10: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
6d20: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
6d30: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
6d40: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6d50: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
6d60: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
6d70: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
6d80: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
6d90: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
6da0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
6db0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
6dc0: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
6dd0: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
6de0: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
6df0: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
6e00: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
6e10: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
6e20: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
6e30: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
6e40: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
6e50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6e60: 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53  ret < 0) {..errS
6e70: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65  tr = statePtr->e
6e80: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65  rr;..Tcl_ResetRe
6e90: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54  sult(interp);..T
6ea0: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29  cl_SetErrno(err)
6eb0: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20  ;...if (!errStr 
6ec0: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30  || (*errStr == 0
6ed0: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72  )) {..    errStr
6ee0: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f   = Tcl_PosixErro
6ef0: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09  r(interp);..}...
6f00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6f10: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68  (interp, "handsh
6f20: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65  ake failed: ", e
6f30: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20  rrStr, (char *) 
6f40: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28  NULL);..dprintf(
6f50: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45  "Returning TCL_E
6f60: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68  RROR with handsh
6f70: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ake failed: %s",
6f80: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72   errStr);..retur
6f90: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
6fa0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
6fb0: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  err != 0) {..   
6fc0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e   dprintf("Got an
6fd0: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f   error with a co
6fe0: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b  mpleted handshak
6ff0: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72  e: err = %i", er
7000: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b  r);..}..ret = 1;
7010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
7020: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
7030: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20  CL_OK with data 
7040: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20  \"%i\"", ret);. 
7050: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
7060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
7070: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b  NewIntObj(ret));
7080: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f  .    return(TCL_
7090: 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  OK);..clientData
70a0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
70b0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7100: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d   ImportObjCmd --
7110: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
7120: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
7130: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
7140: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  "ssl" command. *
7150: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d  . *.The ssl comm
7160: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f  and pushes SSL o
7170: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e  ver a (newly con
7180: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b  nected) tcp sock
7190: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  et. *. * Results
71a0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
71b0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
71c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
71d0: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
71e0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
71f0: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
7200: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7240: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
7250: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d   int.ImportObjCm
7260: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
7270: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
7280: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
7290: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
72a0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
72b0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
72c0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
72d0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
72e0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
72f0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
7300: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
7310: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
7320: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  */.    SSL_CTX *
7330: 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ctx.        = NU
7340: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
7350: 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20  *script.        
7360: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7370: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20  Obj *password.  
7380: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7390: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
73a0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
73b0: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
73c0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
73d0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
73e0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
73f0: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
7400: 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  idx, len;.    in
7410: 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20  t flags..       
7420: 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b   = TLS_TCL_INIT;
7430: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09  .    int server.
7440: 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a  .        = 0;./*
7450: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
7460: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
7470: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
7480: 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20   *keyfile.      
7490: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
74a0: 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20  ar *certfile.   
74b0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
74c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
74d0: 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20  key  .= NULL;.  
74e0: 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20    int key_len   
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
7500: 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  0;.    unsigned 
7510: 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20  char *cert      
7520: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
7530: 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20  nt cert_len     
7540: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
7550: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
7560: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
7570: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
7580: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20  ersuites.       
7590: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
75a0: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20  r *CAfile.      
75b0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
75c0: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20  ar *CAdir..     
75d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
75e0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20  har *DHparams.  
75f0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7600: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20    char *model.. 
7610: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
7620: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
7630: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ame.        = NU
7640: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
7650: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
7660: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
7670: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7680: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
7690: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  d = NULL;.    Tc
76a0: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e  l_Obj *alpn..= N
76b0: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c  ULL;.    int ssl
76c0: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
76d0: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
76e0: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
76f0: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
7700: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
7710: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20  roto = 0, level 
7720: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65  = -1;.    int ve
7730: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72  rify = 0, requir
7740: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d  e = 0, request =
7750: 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   1;..    dprintf
7760: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
7770: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
7780: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
7790: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
77a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
77b0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  2) && !defined(N
77c0: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e  O_SSL2) && defin
77d0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64  ed(NO_SSL3) && d
77e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
77f0: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
7800: 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64  S1_1) && defined
7810: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64  (NO_TLS1_2) && d
7820: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
7830: 29 0a 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a  ).    ssl2 = 1;.
7840: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
7850: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
7860: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
7870: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66  (NO_SSL3) && def
7880: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
7890: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
78a0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
78b0: 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e  TLS1_1) && defin
78c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
78d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
78e0: 5f 33 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31  _3).    ssl3 = 1
78f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
7900: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
7910: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7920: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c  _NO_TLS1).    tl
7930: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  s1 = 0;.#endif.#
7940: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7950: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7960: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7970: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d  _1).    tls1_1 =
7980: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
7990: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
79a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
79b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
79c0: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a      tls1_2 = 0;.
79d0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
79e0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
79f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7a00: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
7a10: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64  tls1_3 = 0;.#end
7a20: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  if..    if (objc
7a30: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
7a40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7a50: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
7a60: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b  nel ?options?");
7a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
7a90: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
7aa0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
7ab0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
7ac0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
7ad0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
7ae0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
7af0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
7b00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7b20: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
7b30: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
7b40: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
7b50: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
7b60: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
7b70: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
7b80: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
7b90: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
7ba0: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
7bb0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7bc0: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a  v[idx], NULL);..
7bd0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
7be0: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
7bf0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72  ..OPTSTR("-cadir
7c00: 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53  ", CAdir);..OPTS
7c10: 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41  TR("-cafile", CA
7c20: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
7c30: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74  -certfile", cert
7c40: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
7c50: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72  -cipher", cipher
7c60: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  s);..OPTSTR("-ci
7c70: 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29  phers", ciphers)
7c80: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
7c90: 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65  ersuites", ciphe
7ca0: 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42  rsuites);..OPTOB
7cb0: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63  J("-command", sc
7cc0: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22  ript);..OPTSTR("
7cd0: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61  -dhparams", DHpa
7ce0: 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  rams);..OPTSTR("
7cf0: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69  -keyfile", keyfi
7d00: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d  le);..OPTSTR("-m
7d10: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09  odel", model);..
7d20: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72  OPTOBJ("-passwor
7d30: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09  d", password);..
7d40: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72  OPTBOOL("-requir
7d50: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f  e", require);..O
7d60: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74  PTBOOL("-request
7d70: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50  ", request);..OP
7d80: 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c  TINT("-securityl
7d90: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09  evel", level);..
7da0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72  OPTBOOL("-server
7db0: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54  ", server);..OPT
7dc0: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65  STR("-servername
7dd0: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a  ", servername);.
7de0: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f  .OPTSTR("-sessio
7df0: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69  n_id", session_i
7e00: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c  d);..OPTOBJ("-al
7e10: 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54  pn", alpn);..OPT
7e20: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73  BOOL("-ssl2", ss
7e30: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l2);..OPTBOOL("-
7e40: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f  ssl3", ssl3);..O
7e50: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20  PTBOOL("-tls1", 
7e60: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  tls1);..OPTBOOL(
7e70: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f  "-tls1.1", tls1_
7e80: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  1);..OPTBOOL("-t
7e90: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b  ls1.2", tls1_2);
7ea0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
7eb0: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f  .3", tls1_3);..O
7ec0: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20  PTBYTE("-cert", 
7ed0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b  cert, cert_len);
7ee0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22  ..OPTBYTE("-key"
7ef0: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b  , key, key_len);
7f00: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f  ...OPTBAD("optio
7f10: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64  n", "-alpn, -cad
7f20: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65  ir, -cafile, -ce
7f30: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d  rt, -certfile, -
7f40: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73  cipher, -ciphers
7f50: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c  uites, -command,
7f60: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79   -dhparams, -key
7f70: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64  , -keyfile, -mod
7f80: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d  el, -password, -
7f90: 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73  require, -reques
7fa0: 74 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65  t, -securityleve
7fb0: 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72  l, -server, -ser
7fc0: 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f  vername, -sessio
7fd0: 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73  n_id, -ssl2, -ss
7fe0: 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31  l3, -tls1, -tls1
7ff0: 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20  .1, -tls1.2, or 
8000: 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74  -tls1.3");...ret
8010: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8020: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71     }.    if (req
8030: 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79  uest).    verify
8040: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
8050: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
8060: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
8070: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
8080: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79   require) verify
8090: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
80a0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
80b0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72  ERT;.    if (ver
80c0: 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79  ify == 0).verify
80d0: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
80e0: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
80f0: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
8100: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
8110: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
8120: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
8130: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
8140: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
8150: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
8160: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8170: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
8180: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
8190: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
81a0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
81b0: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
81c0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
81d0: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
81e0: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
81f0: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
8200: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
8210: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
8220: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
8230: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
8240: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
8250: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
8260: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
8270: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
8280: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8290: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
82a0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
82b0: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
82c0: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
82d0: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
82e0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
82f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8300: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
8310: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
8320: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
8330: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
8340: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a  phersuites && !*
8350: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69  ciphersuites) ci
8360: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20  phersuites    = 
8370: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
8380: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
8390: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
83a0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
83b0: 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26  .    if (CAdir &
83c0: 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20  & !*CAdir).     
83d0: 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20     CAdir.       
83e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
83f0: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44  (DHparams && !*D
8400: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20  Hparams).       
8410: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20   DHparams       
8420: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a   = NULL;..    /*
8430: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a   new SSL state *
8440: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09  /.    statePtr..
8450: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c  = (State *) ckal
8460: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73  loc((unsigned) s
8470: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20  izeof(State));. 
8480: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50     memset(stateP
8490: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74  tr, 0, sizeof(St
84a0: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74  ate));..    stat
84b0: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c  ePtr->flags.= fl
84c0: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ags;.    statePt
84d0: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65  r->interp.= inte
84e0: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rp;.    statePtr
84f0: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66  ->vflags.= verif
8500: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  y;.    statePtr-
8510: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20  >err.= "";..    
8520: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69  /* allocate scri
8530: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63  pt */.    if (sc
8540: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20  ript) {..(void) 
8550: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8560: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65  mObj(script, &le
8570: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
8580: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
8590: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74  allback = script
85a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
85b0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
85c0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a  ->callback);..}.
85d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
85e0: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20  locate password 
85f0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77  */.    if (passw
8600: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ord) {..(void) T
8610: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8620: 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c  Obj(password, &l
8630: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
8640: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
8650: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77  password = passw
8660: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ord;..    Tcl_In
8670: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
8680: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
8690: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
86a0: 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29   (model != NULL)
86b0: 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f   {..int mode;../
86c0: 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c  * Get the "model
86d0: 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68  " context */..ch
86e0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
86f0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65  nel(interp, mode
8700: 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28  l, &mode);..if (
8710: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
8720: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20  nnel) NULL) {.. 
8730: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
8740: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
8750: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8760: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  ERROR;..}.../*..
8770: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20   * Make sure to 
8780: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8790: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09  opmost channel..
87a0: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
87b0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
87c0: 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65  an);..if (Tcl_Ge
87d0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
87e0: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
87f0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20  lType()) {..    
8800: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8810: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8820: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8830: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8840: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
8850: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
8860: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
8870: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
8880: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
8890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
88a0: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74  .}..ctx = ((Stat
88b0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
88c0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
88d0: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20  han))->ctx;.    
88e0: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63  } else {..if ((c
88f0: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74  tx = CTX_Init(st
8900: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20  atePtr, server, 
8910: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20  proto, keyfile, 
8920: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63  certfile, key, c
8930: 65 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c 65  ert,..    key_le
8940: 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64  n, cert_len, CAd
8950: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
8960: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
8970: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
8980: 6d 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58  ms)) == (SSL_CTX
8990: 2a 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  *)0) {..    Tls_
89a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
89b0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
89c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
89d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
89e0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
89f0: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
8a00: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
8a10: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
8a20: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
8a30: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
8a40: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
8a50: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
8a60: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
8a70: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
8a80: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
8a90: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
8aa0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
8ab0: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
8ac0: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
8ad0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
8ae0: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
8af0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
8b00: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
8b10: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
8b20: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
8b30: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
8b40: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
8b50: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
8b60: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
8b70: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
8b80: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
8b90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
8ba0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
8bc0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
8bd0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
8be0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
8bf0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
8c00: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
8c10: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
8c20: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
8c30: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
8c40: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
8c50: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
8c60: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
8c70: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
8c80: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
8c90: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
8ca0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
8cb0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
8cc0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
8cd0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
8ce0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
8cf0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
8d00: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
8d10: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
8d20: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
8d30: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
8d40: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
8d50: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
8d60: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
8d70: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
8d80: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
8d90: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
8da0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
8db0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
8dc0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
8dd0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
8de0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
8df0: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
8e00: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
8e10: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
8e20: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
8e30: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
8e40: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
8e50: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
8e60: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
8e70: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
8e80: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
8e90: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
8ea0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
8eb0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
8ec0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
8ed0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
8ee0: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63   */..Tls_Free((c
8ef0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
8f00: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8f10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8f20: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
8f30: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
8f40: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
8f50: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
8f60: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
8f70: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
8f80: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
8f90: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
8fa0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
8fb0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
8fc0: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
8fd0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
8fe0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
8ff0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
9000: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9010: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
9020: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
9030: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9040: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
9050: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
9060: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9070: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
9080: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
9090: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
90a0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
90b0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
90c0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
90d0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
90e0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
90f0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
9100: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
9110: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
9120: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
9130: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
9140: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
9150: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9160: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
9170: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
9180: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  on: ", REASON(),
9190: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
91a0: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72  ..Tls_Free((char
91b0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
91c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
91d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
91e0: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
91f0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
9200: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 69  servername) {..i
9210: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65  f (!SSL_set_tlse
9220: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61  xt_host_name(sta
9230: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
9240: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69  ername) && requi
9250: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  re) {..    Tcl_A
9260: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9270: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53  rp, "setting TLS
9280: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e   host name exten
9290: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63  sion failed", (c
92a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
92b0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
92c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
92d0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
92e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
92f0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
9300: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
9310: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a  ume session id *
9320: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  /.    if (sessio
9330: 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73  n_id && strlen(s
9340: 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53  ession_id) <= SS
9350: 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45  L_MAX_SID_CTX_LE
9360: 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f  NGTH) {../* SSL_
9370: 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f  set_session() */
9380: 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49  ..if (!SSL_SESSI
9390: 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65  ON_set1_id_conte
93a0: 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69  xt(SSL_get_sessi
93b0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
93c0: 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ), session_id, (
93d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74  unsigned int) st
93e0: 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29  rlen(session_id)
93f0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
9400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9410: 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69  p, "Resume sessi
9420: 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e  on id ", session
9430: 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20  _id, " failed", 
9440: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
9450: 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f              Tls_
9460: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
9470: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20  atePtr);.       
9480: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9490: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
94a0: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b  .    if (alpn) {
94b0: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
94c0: 63 6c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  cl list into a p
94d0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
94e0: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
94f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
9500: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
9510: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
9520: 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c  len = 0;..int i,
9530: 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f   len, cnt;..Tcl_
9540: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 09 69 66 20  Obj **list;..if 
9550: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45  (Tcl_ListObjGetE
9560: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
9570: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73  alpn, &cnt, &lis
9580: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  t) != TCL_OK) {.
9590: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
95a0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
95b0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
95c0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20  L_ERROR;..}../* 
95d0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
95e0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
95f0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
9600: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
9610: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
9620: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
9630: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
9640: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
9650: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
9660: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
9670: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9680: 61 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  alpn protocol na
9690: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
96a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
96b0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
96c0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72  ) statePtr);...r
96d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
96e0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f  ..    }..    pro
96f0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c  tos_len += 1 + l
9700: 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 42 75 69 6c 64  en;..}../* Build
9710: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72   the complete pr
9720: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
9730: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63  protos = ckalloc
9740: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f  (protos_len);../
9750: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73  * protocol-lists
9760: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69   consist of 8-bi
9770: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65  t length-prefixe
9780: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20  d, byte strings 
9790: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20  */..for (i = 0, 
97a0: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20  p = protos; i < 
97b0: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
97c0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c   char *str = Tcl
97d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
97e0: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29  j(list[i], &len)
97f0: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65  ;..    *p++ = le
9800: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70  n;..    memcpy(p
9810: 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20  , str, len);..  
9820: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 09    p += len;..}..
9830: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75  /* Note: This fu
9840: 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73  nctions reverses
9850: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
9860: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a  e convention */.
9870: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70  .if (SSL_set_alp
9880: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74  n_protos(statePt
9890: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20  r->ssl, protos, 
98a0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09  protos_len)) {..
98b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
98c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61  sult(interp, "fa
98d0: 69 6c 65 64 20 74 6f 20 73 65 74 20 61 6c 70 6e  iled to set alpn
98e0: 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68   protocols", (ch
98f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
9900: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
9910: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
9920: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f      ckfree(proto
9930: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  s);..    return 
9940: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f  TCL_ERROR;..}../
9950: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
9960: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
9970: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
9980: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 63 6b 66 72  ol-list */..ckfr
9990: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 20 20 20 20  ee(protos);.    
99a0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
99b0: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20   SSL Callbacks. 
99c0: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73      */.    SSL_s
99d0: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74  et_app_data(stat
99e0: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
99f0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a   *)statePtr);./*
9a00: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75   point back to u
9a10: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  s */.    SSL_set
9a20: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72  _verify(statePtr
9a30: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56  ->ssl, verify, V
9a40: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a  erifyCallback);.
9a50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
9a60: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
9a70: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66  atePtr->ctx, Inf
9a80: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  oCallback);.    
9a90: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
9aa0: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72  _new_cb(statePtr
9ab0: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61  ->ctx, SessionCa
9ac0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a  llback);..    /*
9ad0: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
9ae0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
9af0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
9b00: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
9b10: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
9b20: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
9b30: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
9b40: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
9b50: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
9b60: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
9b70: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
9b80: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61  /..SSL_CTX_set_a
9b90: 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74  lpn_select_cb(st
9ba0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50  atePtr->ctx, ALP
9bb0: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
9bc0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53   *)statePtr);..S
9bd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
9be0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67  t_servername_arg
9bf0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
9c00: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
9c10: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
9c20: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
9c30: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  e_callback(state
9c40: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c  Ptr->ctx, SNICal
9c50: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58  lback);..SSL_CTX
9c60: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  _set_client_hell
9c70: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  o_cb(statePtr->c
9c80: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  tx, HelloCallbac
9c90: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
9ca0: 50 74 72 29 3b 0a 0a 09 73 74 61 74 65 50 74 72  Ptr);...statePtr
9cb0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
9cc0: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f  CL_SERVER;..SSL_
9cd0: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65  set_accept_state
9ce0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
9cf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53  .    } else {..S
9d00: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73  SL_set_connect_s
9d10: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
9d20: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53  sl);.    }.    S
9d30: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65  SL_set_bio(state
9d40: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50  Ptr->ssl, stateP
9d50: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65  tr->p_bio, state
9d60: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20  Ptr->p_bio);.   
9d70: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61   BIO_set_ssl(sta
9d80: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74  tePtr->bio, stat
9d90: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e  ePtr->ssl, BIO_N
9da0: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a  OCLOSE);..    /*
9db0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53  .     * End of S
9dc0: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a  SL Init.     */.
9dd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
9de0: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f  urning %s", Tcl_
9df0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
9e00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
9e10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
9e20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
9e30: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
9e40: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
9e50: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41  >self), TCL_VOLA
9e60: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75  TILE);..    retu
9e70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
9e80: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
9e90: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ee0: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74  -. *. * Unimport
9ef0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
9f00: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
9f10: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d  s invoked to rem
9f20: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20  ove the topmost 
9f30: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a  channel filter..
9f40: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
9f50: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
9f60: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
9f70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9f80: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
9f90: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
9fa0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
9fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ff0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
a000: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  t.UnimportObjCmd
a010: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
a020: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
a030: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
a040: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
a050: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
a060: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
a070: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
a080: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
a090: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64  de on. */..    d
a0a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
a0b0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
a0c0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
a0d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
a0e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
a0f0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
a100: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a110: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
a120: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
a130: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
a140: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
a150: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
a160: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a170: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
a180: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a190: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
a1a0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
a1b0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
a1c0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
a1d0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a1e0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
a1f0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
a200: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
a210: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
a220: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
a230: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a240: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
a250: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
a260: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
a270: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
a280: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  nnel", NULL);..r
a290: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a2a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a2b0: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e  Tcl_UnstackChann
a2c0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
a2d0: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b   == TCL_ERROR) {
a2e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
a2f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  OR;.    }..    r
a300: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
a310: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
a320: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
a330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a370: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
a380: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
a390: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
a3a0: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
a3b0: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
a3c0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
a3d0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
a3e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
a3f0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
a400: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
a410: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a450: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
a460: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e  SSL_CTX *.CTX_In
a470: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  it(State *stateP
a480: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72  tr, int isServer
a490: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
a4a0: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72  r *keyfile, char
a4b0: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20   *certfile,.    
a4c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
a4d0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ey, unsigned cha
a4e0: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79  r *cert, int key
a4f0: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c  _len, int cert_l
a500: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c  en, char *CAdir,
a510: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
a520: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
a530: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
a540: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
a550: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
a560: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
a570: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
a580: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
a590: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
a5a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
a5b0: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54  String ds;.    T
a5c0: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a  cl_DString ds1;.
a5d0: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b      int off = 0;
a5e0: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72  .    int load_pr
a5f0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63  ivate_key;.    c
a600: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
a610: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
a620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
a630: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f  ..    if (!proto
a640: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
a650: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
a660: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  o valid protocol
a670: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c   selected", NULL
a680: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f  );..return (SSL_
a690: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a  CTX *)0;.    }..
a6a0: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
a6b0: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66  L context */.#if
a6c0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
a6d0: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
a6e0: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
a6f0: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
a700: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
a710: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45  _SSL2).    if (E
a720: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
a730: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
a740: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
a750: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
a760: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
a770: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
a780: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
a790: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  X *)0;.    }.#en
a7a0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
a7b0: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
a7c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
a7d0: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL3).    if (ENA
a7e0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
a7f0: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09  PROTO_SSL3)) {..
a800: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a810: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70  (interp, "SSL3 p
a820: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
a830: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
a840: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
a850: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  *)0;.    }.#endi
a860: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
a870: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
a880: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
a890: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
a8a0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
a8b0: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
a8c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a8d0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20  nterp, "TLS 1.0 
a8e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
a8f0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
a900: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58  .return (SSL_CTX
a910: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   *)0;.    }.#end
a920: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
a930: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
a940: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
a950: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28  TLS1_1).    if (
a960: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
a970: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29  LS_PROTO_TLS1_1)
a980: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
a990: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
a9a0: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.1 protocol 
a9b0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
a9c0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28  NULL);..return (
a9d0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20  SSL_CTX *)0;.   
a9e0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
a9f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
aa00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
aa10: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
aa20: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
aa30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
aa40: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
aa50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
aa60: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
aa70: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
aa80: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
aa90: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
aaa0: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  )0;.    }.#endif
aab0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
aac0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
aad0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
aae0: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_3).    if (EN
aaf0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
ab00: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20  _PROTO_TLS1_3)) 
ab10: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
ab20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
ab30: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.3 protocol no
ab40: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
ab50: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53  LL);..return (SS
ab60: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d  L_CTX *)0;.    }
ab70: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69  .#endif..    swi
ab80: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
ab90: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
aba0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
abb0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
abc0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
abd0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
abe0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
abf0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
ac00: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76  :..method = SSLv
ac10: 32 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  2_method();..bre
ac20: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
ac30: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
ac40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
ac50: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
ac60: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
ac70: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
ac80: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
ac90: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68  ROTO_SSL3:..meth
aca0: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f  od = SSLv3_metho
acb0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
acc0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
acd0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
ace0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
acf0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
ad00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
ad10: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  S1_METHOD).    c
ad20: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
ad30: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c  S1:..method = TL
ad40: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  Sv1_method();..b
ad50: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
ad60: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ad70: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
ad80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ad90: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
ada0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
adb0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
adc0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
add0: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54  1_1:..method = T
ade0: 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b  LSv1_1_method();
adf0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
ae00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
ae10: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
ae20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
ae30: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
ae40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
ae50: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
ae60: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
ae70: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_2:..method 
ae80: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64  = TLSv1_2_method
ae90: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
aea0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
aeb0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
aec0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
aed0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
aee0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
aef0: 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65  1_3:../*.. * The
af00: 20 76 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69   version range i
af10: 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65  s constrained be
af20: 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74  low,.. * after t
af30: 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72  he context is cr
af40: 65 61 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a  eated.  Use the.
af50: 09 20 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68  . * generic meth
af60: 6f 64 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d  od here... */..m
af70: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
af80: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
af90: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
afa0: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
afb0: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
afc0: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
afd0: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54  n */..method = T
afe0: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  LS_method();.#if
aff0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
b000: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
b010: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
b020: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
b030: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
b040: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
b050: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
b060: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
b070: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
b080: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
b090: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
b0a0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
b0b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
b0c0: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
b0d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
b0e0: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
b0f0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
b100: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
b110: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
b120: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
b130: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
b140: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
b150: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
b160: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
b170: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
b180: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
b190: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
b1a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
b1b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
b1c0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
b1d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
b1e0: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
b1f0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
b200: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
b210: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
b220: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
b230: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
b240: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
b250: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
b260: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
b270: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
b280: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
b290: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
b2a0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
b2b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b2c0: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
b2d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
b2e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
b2f0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
b300: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
b310: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
b320: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
b330: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20  new(method);..  
b340: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72    if (!ctx) {..r
b350: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20  eturn(NULL);.   
b360: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65   }..    if (gete
b370: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45  nv(SSLKEYLOGFILE
b380: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  )) {..SSL_CTX_se
b390: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63  t_keylog_callbac
b3a0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c  k(ctx, KeyLogCal
b3b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23  lback);.    }..#
b3c0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
b3d0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
b3e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
b3f0: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72  S1_3).    if (pr
b400: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f  oto == TLS_PROTO
b410: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f  _TLS1_3) {..SSL_
b420: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
b430: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
b440: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
b450: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
b460: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
b470: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
b480: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ON);.    }.#endi
b490: 66 0a 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  f..    if (!isSe
b4a0: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
b4b0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
b4c0: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
b4d0: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
b4e0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53  E);.    }..    S
b4f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
b500: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
b510: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
b520: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
b530: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
b540: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
b550: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
b560: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
b570: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
b580: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
b590: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66  options(ctx, off
b5a0: 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70  );../* disable p
b5b0: 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73  rotocol versions
b5c0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
b5d0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
b5e0: 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20   0x10101000L.   
b5f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64   SSL_CTX_set_mod
b600: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f  e(ctx, SSL_MODE_
b610: 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20  AUTO_RETRY);./* 
b620: 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73  handle new hands
b630: 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f  hakes in backgro
b640: 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  und */.#endif.  
b650: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73    SSL_CTX_sess_s
b660: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74  et_cache_size(ct
b670: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a  x, 128);..    /*
b680: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65   Set user define
b690: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65  d ciphers, ciphe
b6a0: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65  r suites, and se
b6b0: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
b6c0: 20 20 20 20 69 66 20 28 28 28 63 69 70 68 65 72      if (((cipher
b6d0: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
b6e0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
b6f0: 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68  r_list(ctx, ciph
b700: 65 72 73 29 29 20 7c 7c 20 5c 0a 09 28 28 63 69  ers)) || \..((ci
b710: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55  phersuites != NU
b720: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
b730: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73  set_ciphersuites
b740: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74  (ctx, ciphersuit
b750: 65 73 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  es))) {..    Tcl
b760: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b770: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65  terp, "Set ciphe
b780: 72 73 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61  rs failed", (cha
b790: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b7a0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
b7b0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
b7c0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
b7d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
b7e0: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
b7f0: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20  /.    if (level 
b800: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20  > -1 && level < 
b810: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  6) {../* SSL_set
b820: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20  _security_level 
b830: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
b840: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63  security_level(c
b850: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20  tx, level);.    
b860: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f  }..    /* set so
b870: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  me callbacks */.
b880: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
b890: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
b8a0: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43  b(ctx, PasswordC
b8b0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
b8c0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
b8d0: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72  t_passwd_cb_user
b8e0: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20  data(ctx, (void 
b8f0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  *)statePtr);..  
b900: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66    /* read a Diff
b910: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d  ie-Hellman param
b920: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75  eters file, or u
b930: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  se the built-in 
b940: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50  one */.#ifdef OP
b950: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20  ENSSL_NO_DH.    
b960: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
b970: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
b980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b990: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20  , "DH parameter 
b9a0: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69  support not avai
b9b0: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29  lable", (char *)
b9c0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
b9d0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
b9e0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
b9f0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
ba00: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66    {..DH* dh;..if
ba10: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
ba20: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a  LL) {..    BIO *
ba30: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  bio;..    Tcl_DS
ba40: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
ba50: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e  .    bio = BIO_n
ba60: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61  ew_file(F2N(DHpa
ba70: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29  rams, &ds), "r")
ba80: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29  ;..    if (!bio)
ba90: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
baa0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c  Free(&ds);...Tcl
bab0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bac0: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
bad0: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74   find DH paramet
bae0: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72  ers file", (char
baf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
bb00: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
bb10: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
bb20: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09  X *)0;..    }...
bb30: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61      dh = PEM_rea
bb40: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62  d_bio_DHparams(b
bb50: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  io, NULL, NULL, 
bb60: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
bb70: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20  free(bio);..    
bb80: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
bb90: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21  &ds);..    if (!
bba0: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  dh) {...Tcl_Appe
bbb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bbc0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64   "Could not read
bbd0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66   DH parameters f
bbe0: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72  rom file", (char
bbf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
bc00: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
bc10: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
bc20: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d  X *)0;..    }..}
bc30: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20   else {..    dh 
bc40: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29  = get_dhParams()
bc50: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ;..}..SSL_CTX_se
bc60: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68  t_tmp_dh(ctx, dh
bc70: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b  );..DH_free(dh);
bc80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
bc90: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65     /* set our ce
bca0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20  rtificate */.   
bcb0: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65   load_private_ke
bcc0: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63  y = 0;.    if (c
bcd0: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  ertfile != NULL)
bce0: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65   {..load_private
bcf0: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f  _key = 1;...Tcl_
bd00: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
bd10: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
bd20: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
bd30: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65  file(ctx, F2N(ce
bd40: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53  rtfile, &ds), SS
bd50: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
bd60: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
bd70: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
bd80: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
bd90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bda0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
bdb0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
bdc0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
bdd0: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
bde0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
bdf0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
be00: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
be10: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43     return (SSL_C
be20: 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d  TX *)0;..}.    }
be30: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
be40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
be50: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
be60: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
be70: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
be80: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
be90: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
bea0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
beb0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
bec0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bed0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
bee0: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63   to set certific
bef0: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  ate: ",....     
bf00: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
bf10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
bf20: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
bf30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53  ;..    return (S
bf40: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20  SL_CTX *)0;..}. 
bf50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72     } else {..cer
bf60: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58  tfile = (char*)X
bf70: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  509_get_default_
bf80: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69  cert_file();...i
bf90: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
bfa0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
bfb0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53  ctx, certfile, S
bfc0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
bfd0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09   <= 0) {.#if 0..
bfe0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
bff0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
c000: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c010: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
c020: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63  to use default c
c030: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
c040: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
c050: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
c060: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
c070: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
c080: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
c090: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54    return (SSL_CT
c0a0: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d  X *)0;.#endif..}
c0b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
c0c0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b  et our private k
c0d0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f  ey */.    if (lo
c0e0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20  ad_private_key) 
c0f0: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d  {..if (keyfile =
c100: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d  = NULL && key ==
c110: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65   NULL) {..    ke
c120: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
c130: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69  ;..}...if (keyfi
c140: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
c150: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72     /* get the pr
c160: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
c170: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
c180: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
c190: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d     if (keyfile =
c1a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66  = NULL) {...keyf
c1b0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
c1c0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
c1d0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
c1e0: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
c1f0: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
c200: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
c210: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
c220: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
c230: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
c240: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
c250: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
c260: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
c270: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
c280: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
c290: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
c2a0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
c2b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
c2c0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
c2d0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
c2e0: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20  yfile, " ",.... 
c2f0: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29          REASON()
c300: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c310: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
c320: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
c330: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20  (SSL_CTX *)0;.. 
c340: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
c350: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
c360: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79  ..} else if (key
c370: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
c380: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
c390: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31  _PrivateKey_ASN1
c3a0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63  (EVP_PKEY_RSA, c
c3b0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29  tx, key,key_len)
c3c0: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
c3d0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
c3e0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
c3f0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
c400: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
c410: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
c420: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
c430: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
c440: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
c450: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c460: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
c470: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a   set public key:
c480: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
c490: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
c4a0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
c4b0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c  );...return (SSL
c4c0: 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d  _CTX *)0;..    }
c4d0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
c4e0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
c4f0: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
c500: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
c510: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
c520: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
c530: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
c540: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
c550: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c560: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
c570: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
c580: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
c590: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
c5a0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
c5b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
c5c0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
c5d0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
c5e0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d  (SSL_CTX *)0;..}
c5f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
c600: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  et verification 
c610: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  CAs */.    Tcl_D
c620: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
c630: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
c640: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20  Init(&ds1);.    
c650: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
c660: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f  d_verify_locatio
c670: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69  ns(ctx, F2N(CAfi
c680: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41  le, &ds), F2N(CA
c690: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09  dir, &ds1)) ||..
c6a0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
c6b0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
c6c0: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a  s(ctx)) {.#if 0.
c6d0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
c6e0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72  (&ds);..Tcl_DStr
c6f0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09  ingFree(&ds1);..
c700: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74  /* Don't current
c710: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20  ly care if this 
c720: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70  fails */..Tcl_Ap
c730: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c740: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20  p, "SSL default 
c750: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c  verify paths: ",
c760: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
c770: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
c780: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
c790: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
c7a0: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *)0;.#endif.    
c7b0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  }..    /* https:
c7c0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
c7d0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
c7e0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54   */.    /* XXX:T
c7f0: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65  ODO: Let the use
c800: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20  r supply values 
c810: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20  here instead of 
c820: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65  something that e
c830: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c  xists on the fil
c840: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69  esystem */.    i
c850: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
c860: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58  L) {..STACK_OF(X
c870: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
c880: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
c890: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
c8a0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
c8b0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73  ;..if (certNames
c8c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
c8d0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
c8e0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
c8f0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a   certNames);..}.
c900: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
c910: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
c920: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
c930: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20  Free(&ds1);.    
c940: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
c950: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
c960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
c9a0: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
c9b0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
c9c0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
c9d0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
c9e0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
c9f0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
ca00: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
ca10: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
ca20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca60: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
ca70: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
ca80: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
ca90: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
caa0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
cab0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
cac0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
cad0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
cae0: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
caf0: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
cb00: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
cb10: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
cb20: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
cb30: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
cb40: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
cb50: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
cb60: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
cb70: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
cb80: 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  en;..    dprintf
cb90: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
cba0: 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b   switch (objc) {
cbb0: 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63  ..case 2:..    c
cbc0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c  hannelName = Tcl
cbd0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
cbe0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
cbf0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
cc00: 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20  case 3:..    if 
cc10: 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65  (!strcmp (Tcl_Ge
cc20: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d  tString (objv[1]
cc30: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a  ), "-local")) {.
cc40: 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20  ..channelName = 
cc50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
cc60: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55  mObj(objv[2], NU
cc70: 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  LL);...break;.. 
cc80: 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73     }..    /* els
cc90: 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e  e fall-through .
cca0: 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .. */.#if define
ccb0: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20  d(__GNUC__)..   
ccc0: 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28   __attribute__((
ccd0: 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23  fallthrough));.#
cce0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
ccf0: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
cd00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
cd10: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f   objv, "?-local?
cd20: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20   channel");..   
cd30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cd40: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  R;.    }..    ch
cd50: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
cd60: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
cd70: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b  nelName, &mode);
cd80: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
cd90: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
cda0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
cdb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cdc0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
cdd0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
cde0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
cdf0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
ce00: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
ce10: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
ce20: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
ce30: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
ce40: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
ce50: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
ce60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
ce70: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
ce80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ce90: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
cea0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
ceb0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  l", NULL);..retu
cec0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ced0: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
cee0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c   = (State *) Tcl
cef0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
cf00: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20  nceData(chan);. 
cf10: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
cf20: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  ) {..peer = SSL_
cf30: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69  get_peer_certifi
cf40: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
cf50: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
cf60: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
cf70: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  t_certificate(st
cf80: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
cf90: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 65 72    }.    if (peer
cfa0: 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c  ) {..objPtr = Tl
cfb0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
cfc0: 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20  erp, peer);..if 
cfd0: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35  (objc == 2) { X5
cfe0: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 20 7d  09_free(peer); }
cff0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f  .    } else {..o
d000: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
d010: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
d020: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
d030: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
d040: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
d050: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
d060: 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d  ngObj("sbits", -
d070: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
d080: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
d090: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
d0a0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
d0b0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62  SSL_get_cipher_b
d0c0: 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  its(statePtr->ss
d0d0: 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20  l, NULL)));..   
d0e0: 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72   ciphers = (char
d0f0: 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  *)SSL_get_cipher
d100: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
d110: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
d120: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73  s != NULL) && (s
d130: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22  trcmp(ciphers, "
d140: 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20  (NONE)") != 0)) 
d150: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
d160: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
d170: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
d180: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69  NewStringObj("ci
d190: 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63  pher", -1));..Tc
d1a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
d1b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
d1c0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
d1d0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
d1e0: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
d1f0: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20  >ssl), -1));.   
d200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66   }..    /* Verif
d210: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69  y the X509 certi
d220: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64  ficate presented
d230: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a   by the peer */.
d240: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
d250: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
d260: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
d270: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76  _NewStringObj("v
d280: 61 6c 69 64 61 74 69 6f 6e 22 2c 20 2d 31 29 29  alidation", -1))
d290: 3b 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65  ;.    if (SSL_ge
d2a0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
d2b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21  statePtr->ssl) !
d2c0: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09  = X509_V_OK) {..
d2d0: 2f 2a 20 70 72 6f 74 6f 20 3d 20 22 66 61 69 6c  /* proto = "fail
d2e0: 65 64 22 3b 20 2a 2f 0a 09 70 72 6f 74 6f 20 3d  ed"; */..proto =
d2f0: 20 52 45 41 53 4f 4e 28 29 3b 0a 20 20 20 20 7d   REASON();.    }
d300: 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d   else {..proto =
d310: 20 22 6f 6b 22 3b 0a 20 20 20 20 7d 0a 20 20 20   "ok";.    }.   
d320: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
d330: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
d340: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
d350: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
d360: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
d370: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
d380: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
d390: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
d3a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20  negotiation */. 
d3b0: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e     SSL_get0_alpn
d3c0: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50  _selected(stateP
d3d0: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  tr->ssl, &proto,
d3e0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f   &len);.    Tcl_
d3f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
d400: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
d410: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
d420: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
d430: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
d440: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
d450: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
d460: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
d470: 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c  j((char *)proto,
d480: 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 20 20 20   (int)len));.   
d490: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
d4a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
d4b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
d4c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 73  wStringObj("vers
d4d0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ion", -1));.    
d4e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
d4f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
d500: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
d510: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
d520: 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
d530: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  tr->ssl), -1));.
d540: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
d550: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
d560: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
d570: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
d580: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
d590: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5e0: 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f  . *. * Connectio
d5f0: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72  nInfoObjCmd -- r
d600: 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  eturn connection
d610: 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53   info from OpenS
d620: 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
d630: 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20  s:. *.A list of 
d640: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a  connection info.
d650: 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    *. *----------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
d6a0: 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63  tatic int Connec
d6b0: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43  tionInfoObjCmd(C
d6c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
d6d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
d6e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
d6f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
d700: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
d710: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
d720: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
d730: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
d740: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
d750: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
d760: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
d770: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
d780: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
d790: 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  Ptr;.    const S
d7a0: 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e  SL *ssl;.    con
d7b0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
d7c0: 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ipher;.    const
d7d0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65   SSL_SESSION *se
d7e0: 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  ssion;.    const
d7f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d800: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67  proto;.    unsig
d810: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20  ned int len;.   
d820: 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 23 69 66 20   long mode;.#if 
d830: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 53 4c  defined(HAVE_SSL
d840: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 0a 20 20  _COMPRESSION).  
d850: 20 20 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54    const COMP_MET
d860: 48 4f 44 20 2a 63 6f 6d 70 3b 0a 23 65 6e 64 69  HOD *comp;.#endi
d870: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  f..    if (objc 
d880: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
d890: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d8a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
d8b0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
d8c0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
d8d0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
d8e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
d8f0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d900: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
d910: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  , NULL), NULL);.
d920: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
d930: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
d940: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43  LL) {..return(TC
d950: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
d960: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
d970: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
d980: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
d990: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
d9a0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
d9b0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
d9c0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
d9d0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
d9e0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
d9f0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
da00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
da10: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
da20: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
da30: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e  me(chan), "\": n
da40: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
da50: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
da60: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
da70: 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
da80: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
da90: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
daa0: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  /* Connection in
dab0: 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  fo */.    stateP
dac0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
dad0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
dae0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
daf0: 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50      ssl = stateP
db00: 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20  tr->ssl;.    if 
db10: 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl != NULL) {.
db20: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 61  .const char *sta
db30: 74 65 3b 0a 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  te;.../* connect
db40: 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 69 66  ion state */..if
db50: 20 28 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69   (SSL_is_init_fi
db60: 6e 69 73 68 65 64 28 73 73 6c 29 29 20 7b 0a 09  nished(ssl)) {..
db70: 20 20 20 20 73 74 61 74 65 20 3d 20 22 65 73 74      state = "est
db80: 61 62 6c 69 73 68 65 64 22 3b 0a 09 7d 20 65 6c  ablished";..} el
db90: 73 65 20 69 66 20 28 53 53 4c 5f 69 6e 5f 69 6e  se if (SSL_in_in
dba0: 69 74 28 73 73 6c 29 29 20 7b 0a 09 20 20 20 20  it(ssl)) {..    
dbb0: 73 74 61 74 65 20 3d 20 22 68 61 6e 64 73 68 61  state = "handsha
dbc0: 6b 65 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ke";..} else {..
dbd0: 20 20 20 20 73 74 61 74 65 20 3d 20 22 69 6e 69      state = "ini
dbe0: 74 69 61 6c 69 7a 69 6e 67 22 3b 0a 09 7d 0a 09  tializing";..}..
dbf0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
dc00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
dc10: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
dc20: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65  StringObj("state
dc30: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
dc40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
dc50: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
dc60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
dc70: 4f 62 6a 28 73 74 61 74 65 2c 20 2d 31 29 29 3b  Obj(state, -1));
dc80: 0a 0a 09 2f 2a 20 47 65 74 20 73 65 72 76 65 72  .../* Get server
dc90: 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69   name */..Tcl_Li
dca0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
dcb0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
dcc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
dcd0: 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22  Obj("servername"
dce0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
dcf0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
dd00: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
dd10: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
dd20: 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  bj(SSL_get_serve
dd30: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
dd40: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
dd50: 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f  name), -1));.../
dd60: 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  * Get protocol *
dd70: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
dd80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
dd90: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
dda0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72  NewStringObj("pr
ddb0: 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09  otocol", -1));..
ddc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ddd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
dde0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
ddf0: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
de00: 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
de10: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67  -1));.../* Reneg
de20: 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64  otiation allowed
de30: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
de40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
de50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
de60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
de70: 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20  renegotiation", 
de80: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
de90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
dea0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
deb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
dec0: 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73  (..    SSL_get_s
ded0: 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
dee0: 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29  ion_support(ssl)
def0: 20 3f 20 22 61 6c 6c 6f 77 65 64 22 20 3a 20 22   ? "allowed" : "
df00: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
df10: 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  -1));.../* Repor
df20: 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
df30: 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
df40: 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
df50: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
df60: 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  SSL_get0_alpn_se
df70: 6c 65 63 74 65 64 28 73 73 6c 2c 20 26 70 72 6f  lected(ssl, &pro
df80: 74 6f 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f  to, &len);..Tcl_
df90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
dfa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
dfb0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
dfc0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
dfd0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
dfe0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
dff0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
e000: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
e010: 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69  char *)proto, (i
e020: 6e 74 29 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 47  nt)len));.../* G
e030: 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65  et security leve
e040: 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  l */..Tcl_ListOb
e050: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
e060: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
e070: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e080: 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c  "securitylevel",
e090: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
e0a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e0b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e0c0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
e0d0: 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
e0e0: 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 20 20  level(ssl)));.  
e0f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68    }..    /* Ciph
e100: 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63  er info */.    c
e110: 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  ipher = SSL_get_
e120: 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73  current_cipher(s
e130: 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70  sl);.    if (cip
e140: 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  her != NULL) {..
e150: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
e160: 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74   = {0};..int bit
e170: 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54  s, alg_bits;...T
e180: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e190: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e1a0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e1b0: 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72  tringObj("cipher
e1c0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
e1d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e1e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e1f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e200: 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  Obj(SSL_CIPHER_g
e210: 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  et_name(cipher),
e220: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
e230: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e240: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e250: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e260: 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  j("standard_name
e270: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
e280: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e290: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e2a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e2b0: 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73  Obj(SSL_CIPHER_s
e2c0: 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
e2d0: 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69  her), -1));...bi
e2e0: 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  ts = SSL_CIPHER_
e2f0: 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c  get_bits(cipher,
e300: 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63   &alg_bits);..Tc
e310: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e320: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
e330: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
e340: 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20  ringObj("bits", 
e350: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
e360: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
e370: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
e380: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69  Tcl_NewIntObj(bi
e390: 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  ts));..Tcl_ListO
e3a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
e3b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
e3c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
e3d0: 28 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20  ("secret_bits", 
e3e0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
e3f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
e400: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
e410: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c  Tcl_NewIntObj(al
e420: 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c  g_bits));../* al
e430: 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c  g_bits is actual
e440: 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73   key secret bits
e450: 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e  . If use bits an
e460: 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69  d secret (algori
e470: 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72  thm) bits differ
e480: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 65  ,.           the
e490: 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74   rest of the bit
e4a0: 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65  s are fixed, i.e
e4b0: 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78  . for limited ex
e4c0: 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69  port ciphers (bi
e4d0: 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c  ts < 56) */..Tcl
e4e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e4f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e500: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e510: 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73  ingObj("min_vers
e520: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ion", -1));..Tcl
e530: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e540: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e550: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e560: 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
e570: 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69  R_get_version(ci
e580: 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 69  pher), -1));...i
e590: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
e5a0: 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72  scription(cipher
e5b0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
e5c0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
e5d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
e5e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
e5f0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e600: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64  _NewStringObj("d
e610: 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29  escription", -1)
e620: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
e630: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e640: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e650: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e660: 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a  j(buf, -1));..}.
e670: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
e680: 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
e690: 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
e6a0: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
e6b0: 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
e6c0: 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
e6d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
e6e0: 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
e6f0: 5f 74 20 6c 65 6e 32 3b 0a 09 63 6f 6e 73 74 20  _t len2;..const 
e700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
e710: 65 73 73 69 6f 6e 5f 69 64 3b 0a 0a 09 2f 2a 20  ession_id;.../* 
e720: 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
e730: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
e740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
e750: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
e760: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73  wStringObj("sess
e770: 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29  ion_reused", -1)
e780: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
e790: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
e7a0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e7b0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 73  _NewIntObj(SSL_s
e7c0: 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
e7d0: 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  l)));.../* Sessi
e7e0: 6f 6e 20 69 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69  on id */..Tcl_Li
e7f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e800: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e810: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e820: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22  Obj("session_id"
e830: 2c 20 2d 31 29 29 3b 0a 09 73 65 73 73 69 6f 6e  , -1));..session
e840: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
e850: 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
e860: 74 28 73 65 73 73 69 6f 6e 2c 20 26 6c 65 6e 29  t(session, &len)
e870: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
e880: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e890: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e8a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 73  NewStringObj(ses
e8b0: 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 6c 65  sion_id, (int)le
e8c0: 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
e8d0: 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 09 53 53 4c  n ticket */..SSL
e8e0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
e8f0: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74  cket(session, &t
e900: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09  icket, &len2);..
e910: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e920: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e930: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
e940: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
e950: 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31 29 29  on_ticket", -1))
e960: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
e970: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e980: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e990: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 69 63  NewStringObj(tic
e9a0: 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  ket, (int) len2)
e9b0: 29 3b 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  );.../* Resumabl
e9c0: 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63  e session */..Tc
e9d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e9e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
e9f0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ea00: 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62  ringObj("resumab
ea10: 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  le", -1));..Tcl_
ea20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ea30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ea40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
ea50: 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69  bj(SSL_SESSION_i
ea60: 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73  s_resumable(sess
ea70: 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 74 61  ion)));.../* Sta
ea80: 72 74 20 74 69 6d 65 20 2a 2f 0a 09 54 63 6c 5f  rt time */..Tcl_
ea90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
eaa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
eab0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
eac0: 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d  ngObj("start_tim
ead0: 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
eae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
eaf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
eb00: 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f  tr, Tcl_NewLongO
eb10: 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  bj(SSL_SESSION_g
eb20: 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29  et_time(session)
eb30: 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74  ));.../* Timeout
eb40: 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4c   value */..Tcl_L
eb50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
eb60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
eb70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
eb80: 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c 20  gObj("timeout", 
eb90: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
eba0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ebb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ebc0: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53  Tcl_NewLongObj(S
ebd0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
ebe0: 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29  imeout(session))
ebf0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  );.    }..#if de
ec00: 66 69 6e 65 64 28 48 41 56 45 5f 53 53 4c 5f 43  fined(HAVE_SSL_C
ec10: 4f 4d 50 52 45 53 53 49 4f 4e 29 0a 20 20 20 20  OMPRESSION).    
ec20: 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
ec30: 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 6f 6d 70 20  nfo */.    comp 
ec40: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
ec50: 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73  t_compression(ss
ec60: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 6d 70  l);.    if (comp
ec70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
ec80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ec90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
eca0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ecb0: 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73  ingObj("compress
ecc0: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ion", -1));..Tcl
ecd0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ece0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ecf0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ed00: 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 4f 4d 50 5f  ingObj(SSL_COMP_
ed10: 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 2c 20  get_name(comp), 
ed20: 2d 31 29 29 3b 0a 09 63 6f 6d 70 20 3d 20 53 53  -1));..comp = SS
ed30: 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78  L_get_current_ex
ed40: 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 54  pansion(ssl);..T
ed50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ed60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ed70: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
ed80: 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73  tringObj("expans
ed90: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ion", -1));..Tcl
eda0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
edb0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
edc0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
edd0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 4f 4d 50 5f  ingObj(SSL_COMP_
ede0: 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 2c 20  get_name(comp), 
edf0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  -1));.    }.#end
ee00: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65  if..    /* Serve
ee10: 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f  r info */.    mo
ee20: 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
ee30: 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
ee40: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
ee50: 78 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65  x);.    if (mode
ee60: 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
ee70: 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20  E_OFF) {..proto 
ee80: 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65  = "off";.    } e
ee90: 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
eea0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
eeb0: 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d  IENT) {..proto =
eec0: 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d   "client";.    }
eed0: 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
eee0: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
eef0: 53 45 52 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f  SERVER) {..proto
ef00: 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 20 20 20   = "server";.   
ef10: 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65   } else if (mode
ef20: 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
ef30: 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f  E_BOTH) {..proto
ef40: 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d   = "both";.    }
ef50: 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d   else {..proto =
ef60: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
ef70: 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
ef80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ef90: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
efa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
efb0: 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  "session_cache_m
efc0: 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ode", -1));.    
efd0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
efe0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
eff0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f000: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c  StringObj(proto,
f010: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
f020: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
f030: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
f040: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f050: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
f060: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
f070: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
f0c0: 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72  rsionObjCmd -- r
f0d0: 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74  eturn version st
f0e0: 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53  ring from OpenSS
f0f0: 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
f100: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
f110: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
f120: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
f130: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
f140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f180: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
f190: 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43  .VersionObjCmd(C
f1a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
f1b0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
f1c0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
f1d0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
f1e0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
f1f0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
f200: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
f210: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f  Called");..    o
f220: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
f230: 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c  tringObj(OPENSSL
f240: 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d  _VERSION_TEXT, -
f250: 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  1);.    Tcl_SetO
f260: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
f270: 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72   objPtr);..    r
f280: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
f290: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
f2a0: 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20  ntData;..objc = 
f2b0: 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62  objc;..objv = ob
f2c0: 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  jv;.}.../*. *---
f2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f310: 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d  . *. * MiscObjCm
f320: 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e  d -- misc comman
f330: 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ds. *. * Results
f340: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
f350: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
f360: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
f370: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3c0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
f3d0: 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65  .MiscObjCmd(Clie
f3e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
f3f0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
f400: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
f410: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
f420: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74  objv[]) {.    st
f430: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
f440: 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b  *commands [] = {
f450: 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22   "req", "strreq"
f460: 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e  , NULL };.    en
f470: 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52  um command { C_R
f480: 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f  EQ, C_STRREQ, C_
f490: 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74  DUMMY };.    int
f4a0: 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20   cmd, isStr;.   
f4b0: 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
f4c0: 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  84];..    dprint
f4d0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
f4e0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
f4f0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
f500: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
f510: 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64  bjv, "subcommand
f520: 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75   ?args?");..retu
f530: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f540: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
f550: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
f560: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
f570: 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d   commands, "comm
f580: 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d  and", 0,&cmd) !=
f590: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
f5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f5b0: 20 20 7d 0a 0a 20 20 20 20 69 73 53 74 72 20 3d    }..    isStr =
f5c0: 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45   (cmd == C_STRRE
f5d0: 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  Q);.    switch (
f5e0: 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63  (enum command) c
f5f0: 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45  md) {..case C_RE
f600: 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45  Q:..case C_STRRE
f610: 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b  Q: {..    EVP_PK
f620: 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09  EY *pkey=NULL;..
f630: 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e      X509 *cert=N
f640: 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e  ULL;..    X509_N
f650: 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a  AME *name=NULL;.
f660: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  .    Tcl_Obj **l
f670: 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c  istv;..    int l
f680: 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49  istc,i;...    BI
f690: 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
f6a0: 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
f6b0: 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
f6c0: 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
f6d0: 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
f6e0: 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
f6f0: 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
f700: 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
f710: 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
f720: 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66  0,days=365;..#if
f730: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
f740: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
f750: 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55  0000L..    BIGNU
f760: 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09  M *bne = NULL;..
f770: 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e      RSA *rsa = N
f780: 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ULL;.#else..    
f790: 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74  EVP_PKEY_CTX *ct
f7a0: 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  x = NULL;.#endif
f7b0: 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ...    if ((objc
f7c0: 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
f7d0: 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
f7e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f7f0: 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
f800: 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
f810: 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
f820: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
f830: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
f840: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
f850: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
f860: 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
f870: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
f880: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
f890: 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
f8a0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
f8b0: 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
f8c0: 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
f8d0: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20  ng(objv[4]);..  
f8e0: 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09    if (isStr) {..
f8f0: 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
f900: 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b  rp,keyout,"",0);
f910: 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
f920: 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30  terp,pemout,"",0
f930: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
f940: 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
f950: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
f960: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
f970: 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09  rp, objv[5],....
f980: 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20  &listc, &listv) 
f990: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20  != TCL_OK) {... 
f9a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f9b0: 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
f9c0: 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20  (listc%2) != 0) 
f9d0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
f9e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e  esult(interp,"In
f9f0: 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d  formation list m
fa00: 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75  ust have even nu
fa10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
fa20: 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  s",NULL);...    
fa30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fa40: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30  ;...}...for (i=0
fa50: 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29  ; i<listc; i+=2)
fa60: 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c   {...    str=Tcl
fa70: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
fa80: 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28  [i]);...    if (
fa90: 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73  strcmp(str,"days
faa0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
fab0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
fac0: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
fad0: 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f  +1],&days)!=TCL_
fae0: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
faf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
fb00: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
fb10: 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c  rcmp(str,"serial
fb20: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
fb30: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
fb40: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
fb50: 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43  +1],&serial)!=TC
fb60: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
fb70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
fb80: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
fb90: 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d  strcmp(str,"C")=
fba0: 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c  =0) {....k_C=Tcl
fbb0: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
fbc0: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
fbd0: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
fbe0: 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a  str,"ST")==0) {.
fbf0: 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53  ...k_ST=Tcl_GetS
fc00: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
fc10: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
fc20: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
fc30: 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c  L")==0) {....k_L
fc40: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
fc50: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
fc60: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
fc70: 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29  cmp(str,"O")==0)
fc80: 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65   {....k_O=Tcl_Ge
fc90: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
fca0: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
fcb0: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
fcc0: 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"OU")==0) {....
fcd0: 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_OU=Tcl_GetStri
fce0: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
fcf0: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
fd00: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22  (strcmp(str,"CN"
fd10: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d  )==0) {....k_CN=
fd20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
fd30: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
fd40: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
fd50: 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d  mp(str,"Email")=
fd60: 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c  =0) {....k_Email
fd70: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
fd80: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
fd90: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63    } else {....Tc
fda0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
fdb0: 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61  rp,"Unknown para
fdc0: 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09  meter",NULL);...
fdd0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
fde0: 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09  R;...    }...}..
fdf0: 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53      }..#if OPENS
fe00: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
fe10: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
fe20: 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65  .    bne = BN_ne
fe30: 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20  w();..    rsa = 
fe40: 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20  RSA_new();..    
fe50: 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f  pkey = EVP_PKEY_
fe60: 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28  new();..    if (
fe70: 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72  bne == NULL || r
fe80: 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b  sa == NULL || pk
fe90: 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42  ey == NULL || !B
fea0: 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52  N_set_word(bne,R
feb0: 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41  SA_F4) ||...!RSA
fec0: 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78  _generate_key_ex
fed0: 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62  (rsa, keysize, b
fee0: 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56  ne, NULL) || !EV
fef0: 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53  P_PKEY_assign_RS
ff00: 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a  A(pkey, rsa)) {.
ff10: 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
ff20: 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f  pkey);.../* RSA_
ff30: 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64  free(rsa); freed
ff40: 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65   by EVP_PKEY_fre
ff50: 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62  e */...BN_free(b
ff60: 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ne);.#else..    
ff70: 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67  pkey = EVP_RSA_g
ff80: 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  en((unsigned int
ff90: 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20  ) keysize);..   
ffa0: 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f   ctx = EVP_PKEY_
ffb0: 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c  CTX_new(pkey,NUL
ffc0: 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65  L);..    if (pke
ffd0: 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78  y == NULL || ctx
ffe0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50   == NULL || !EVP
fff0: 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69  _PKEY_keygen_ini
10000 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50  t(ctx) ||...!EVP
10010 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73  _PKEY_CTX_set_rs
10020 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74  a_keygen_bits(ct
10030 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21  x, keysize) || !
10040 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28  EVP_PKEY_keygen(
10050 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09  ctx, &pkey)) {..
10060 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
10070 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  key);...EVP_PKEY
10080 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
10090 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74  #endif...Tcl_Set
100a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
100b0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
100c0 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c  private key",NUL
100d0 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
100e0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65  _ERROR;..    } e
100f0 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74  lse {...if (isSt
10100 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
10110 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
10120 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
10130 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
10140 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
10150 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
10160 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  LL);...    i=BIO
10170 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
10180 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
10190 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
101a0 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
101b0 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
101c0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
101d0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
101e0 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
101f0 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
10200 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
10210 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
10220 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
10230 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
10240 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
10250 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b  e_filename(out,k
10260 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  eyout);...    PE
10270 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
10280 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
10290 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
102a0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a  ,NULL);...    /*
102b0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52   PEM_write_bio_R
102c0 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  SAPrivateKey(out
102d0 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  , rsa, NULL, NUL
102e0 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  L, 0, NULL, NULL
102f0 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f  ); */...    BIO_
10300 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09  free_all(out);..
10310 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74   .}....if ((cert
10320 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55  =X509_new())==NU
10330 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  LL) {...    Tcl_
10340 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
10350 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
10360 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72  ng certificate r
10370 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09  equest",NULL);..
10380 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
10390 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
103a0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
103b0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
103c0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
103d0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
103e0 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45      return(TCL_E
103f0 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  RROR);...}....X5
10400 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63  09_set_version(c
10410 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49  ert,2);...ASN1_I
10420 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f  NTEGER_set(X509_
10430 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72  get_serialNumber
10440 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a  (cert),serial);.
10450 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
10460 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42  j(X509_getm_notB
10470 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a  efore(cert),0);.
10480 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
10490 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41  j(X509_getm_notA
104a0 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67  fter(cert),(long
104b0 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b  )60*60*24*days);
104c0 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b  ...X509_set_pubk
104d0 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a  ey(cert,pkey);..
104e0 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f  ..name=X509_get_
104f0 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
10500 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45  t);....X509_NAME
10510 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
10520 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54  t(name,"C", MBST
10530 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
10540 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10550 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_C, -1, -1, 0
10560 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
10570 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
10580 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52  name,"ST", MBSTR
10590 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
105a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
105b0 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30   k_ST, -1, -1, 0
105c0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
105d0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
105e0 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49  name,"L", MBSTRI
105f0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
10600 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
10610 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_L, -1, -1, 0);
10620 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
10630 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
10640 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47  me,"O", MBSTRING
10650 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
10660 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
10670 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  O, -1, -1, 0);..
10680 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
10690 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
106a0 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"OU", MBSTRING_
106b0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
106c0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
106d0 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  U, -1, -1, 0);..
106e0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
106f0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
10700 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"CN", MBSTRING_
10710 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
10720 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
10730 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  N, -1, -1, 0);..
10740 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
10750 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
10760 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49  ,"Email", MBSTRI
10770 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
10780 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
10790 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c  k_Email, -1, -1,
107a0 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74   0);....X509_set
107b0 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
107c0 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20  rt,name);....if 
107d0 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74  (!X509_sign(cert
107e0 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36  ,pkey,EVP_sha256
107f0 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30  ())) {...    X50
10800 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
10810 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
10820 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
10830 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
10840 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
10850 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
10860 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
10870 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
10880 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73  (interp,"Error s
10890 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61  igning certifica
108a0 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  te",NULL);...   
108b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
108c0 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73  R;...}....if (is
108d0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
108e0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
108f0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
10900 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28  _write_bio_X509(
10910 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20  out,cert);...   
10920 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c   i=BIO_read(out,
10930 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75  buffer,sizeof(bu
10940 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20  ffer)-1);...    
10950 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b  i=(i<0) ? 0 : i;
10960 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d  ...    buffer[i]
10970 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c  ='\0';...    Tcl
10980 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70  _SetVar(interp,p
10990 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b  emout,buffer,0);
109a0 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68  ...    BIO_flush
109b0 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  (out);...    BIO
109c0 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20  _free(out);...} 
109d0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74  else {...    out
109e0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66  =BIO_new(BIO_s_f
109f0 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49  ile());...    BI
10a00 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65  O_write_filename
10a10 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09  (out,pemout);...
10a20 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
10a30 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
10a40 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
10a50 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a  _all(out);...}..
10a60 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74  ..X509_free(cert
10a70 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72  );...EVP_PKEY_fr
10a80 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
10a90 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
10aa0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
10ab0 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65  0L...BN_free(bne
10ac0 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d  );.#endif..    }
10ad0 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  ..}..break;.    
10ae0 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b  default:..break;
10af0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10b00 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
10b10 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
10b20 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  ta;.}.../*******
10b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
10b40 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20  * Init          
10b50 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
10b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10b70 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
10bc0 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Free --. *. *.T
10bd0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
10be0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
10bf0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
10c00 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
10c10 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
10c20 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
10c30 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a  ls below 1. *. *
10c40 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
10c50 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
10c60 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
10c70 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
10c80 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cc0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
10cd0 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c  ls_Free(char *bl
10ce0 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74  ockPtr) {.    St
10cf0 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
10d00 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74  (State *)blockPt
10d10 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
10d20 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
10d30 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50  Tls_Clean(stateP
10d40 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  tr);.    ckfree(
10d50 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
10d60 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
10d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
10db0 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
10dc0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
10dd0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
10de0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
10df0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
10e00 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
10e10 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
10e20 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
10e30 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
10e40 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
10e50 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
10e60 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
10e70 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
10e80 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
10e90 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10ea0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
10eb0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
10ec0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
10ed0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
10f20 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id Tls_Clean(Sta
10f30 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
10f40 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
10f50 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  led");..    /*. 
10f60 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75      * we're assu
10f70 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77  ming here that w
10f80 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65  e're single-thre
10f90 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  aded.     */.   
10fa0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
10fb0 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
10fc0 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
10fd0 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
10fe0 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
10ff0 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
11000 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
11010 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
11020 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  f (statePtr->bio
11030 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c  ) {../* This wil
11040 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64  l call SSL_shutd
11050 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35  own. Bug 1414045
11060 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49   */..dprintf("BI
11070 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c  O_free_all(%p)",
11080 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b   statePtr->bio);
11090 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73  ..BIO_free_all(s
110a0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
110b0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20  statePtr->bio = 
110c0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
110d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73  if (statePtr->ss
110e0 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53  l) {..dprintf("S
110f0 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74  SL_free(%p)", st
11100 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
11110 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
11120 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
11130 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
11140 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
11150 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53  tePtr->ctx) {..S
11160 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  SL_CTX_free(stat
11170 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61  ePtr->ctx);..sta
11180 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c  tePtr->ctx = NUL
11190 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
111a0 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
111b0 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ack) {..Tcl_Decr
111c0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
111d0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73  r->callback);..s
111e0 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
111f0 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
11200 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
11210 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54  ->password) {..T
11220 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
11230 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
11240 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  rd);..statePtr->
11250 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b  password = NULL;
11260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
11270 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
11280 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
11290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
112d0 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
112e0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
112f0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
11300 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
11310 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
11320 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65  ed. *.by Tcl whe
11330 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
11340 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
11350 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
11360 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20  . *. * Results: 
11370 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20   Ssl configured 
11380 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a  and loaded. *. *
11390 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
113a0 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73  *. create the ss
113b0 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69  l command, initi
113c0 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78  alize ssl contex
113d0 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
113e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44  ----------. */.D
11420 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
11430 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
11440 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
11450 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63  const char tlsTc
11460 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20  lInitScript[] = 
11470 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e  {.#include "tls.
11480 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20  tcl.h"..0x00.   
11490 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   };..    dprintf
114a0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
114b0 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e   /*.     * We on
114c0 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38  ly support Tcl 8
114d0 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20  .4 or newer.    
114e0 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66   */.    if (.#if
114f0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
11500 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  S..Tcl_InitStubs
11510 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
11520 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b  0).#else..Tcl_Pk
11530 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c  gRequire(interp,
11540 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20   "Tcl", "8.4-", 
11550 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e  0).#endif.. == N
11560 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
11570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11580 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
11590 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
115a0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
115b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
115c0 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
115d0 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
115e0 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
115f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11600 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  }..    Tcl_Creat
11610 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
11620 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  rp, "tls::cipher
11630 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
11640 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
11650 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
11660 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
11670 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
11680 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
11690 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f   "tls::connectio
116a0 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
116b0 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
116c0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
116d0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
116e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
116f0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
11700 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61  interp, "tls::ha
11710 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
11720 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  akeObjCmd, (Clie
11730 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
11740 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
11750 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
11760 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
11770 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69  (interp, "tls::i
11780 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62  mport", ImportOb
11790 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
117a0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
117b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
117c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
117d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
117e0 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f  rp, "tls::unimpo
117f0 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  rt", UnimportObj
11800 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
11810 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
11820 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
11830 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
11840 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
11850 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22  p, "tls::status"
11860 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20  , StatusObjCmd, 
11870 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
11880 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
11890 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
118a0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
118b0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
118c0 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65  ls::version", Ve
118d0 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c  rsionObjCmd, (Cl
118e0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
118f0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
11900 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
11910 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
11920 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
11930 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
11940 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
11950 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
11960 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
11970 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
11980 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
11990 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c  , "tls::protocol
119a0 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  s", ProtocolsObj
119b0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
119c0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
119d0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
119e0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72  ;..    if (inter
119f0 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69  p) {..Tcl_Eval(i
11a00 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
11a10 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  tScript);.    }.
11a20 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f  .    return(Tcl_
11a30 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
11a40 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47  p, "tls", PACKAG
11a50 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a  E_VERSION));.}..
11a60 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
11aa0 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
11ab0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74  ---------*. *.St
11af0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
11b00 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
11b10 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
11b20 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
11b30 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
11b40 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
11b80 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
11b90 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
11ba0 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
11bb0 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
11bc0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
11bd0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c10 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
11c20 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
11c30 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
11c40 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
11c50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
11c60 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e     return(Tls_In
11c70 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a  it(interp));.}..
11c80 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
11c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
11cc0 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
11cd0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d00 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
11d10 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
11d20 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
11d30 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
11d70 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
11d80 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
11d90 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
11da0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
11db0 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11df0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
11e00 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
11e10 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
11e20 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
11e30 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
11e40 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
11e50 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
11e60 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
11e70 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
11e80 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
11e90 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
11ea0 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
11eb0 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
11ec0 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
11ed0 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 64 70 72 69              dpri
11ef0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
11f00 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20  initialize, but 
11f10 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69  we are not initi
11f20 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20  alized");..     
11f30 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43         return(TC
11f40 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  L_OK);.        }
11f50 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74  ..        dprint
11f60 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e  f("Asked to unin
11f70 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66  itialize");..#if
11f80 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
11f90 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
11fa0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
11fb0 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75  ).        Tcl_Mu
11fc0 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
11fd0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28  );..        if (
11fe0 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20  locks) {.       
11ff0 20 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29       free(locks)
12000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
12010 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  cks = NULL;.    
12020 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75          locksCou
12030 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
12040 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
12050 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30   initialized = 0
12060 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
12070 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
12080 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
12090 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20  HREADS).        
120a0 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28  Tcl_MutexUnlock(
120b0 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
120c0 66 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  f..        retur
120d0 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d  n(TCL_OK);.    }
120e0 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61  ..    if (initia
120f0 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20  lized) {.       
12100 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12110 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68  , but using cach
12120 65 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20  ed value");.    
12130 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75      return(statu
12140 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  s);.    }..    d
12150 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
12160 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
12170 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
12180 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
12190 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
121a0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
121b0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
121c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
121d0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
121e0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
121f0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
12200 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
12210 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
12220 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
12230 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
12240 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
12250 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
12260 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
12270 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
12280 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
12290 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
122a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
122b0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
122c0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
122d0 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
122e0 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
122f0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
12300 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
12310 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
12320 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
12330 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
12340 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
12350 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
12360 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
12370 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
12380 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
12390 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
123a0 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
123b0 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
123c0 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
123d0 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
123e0 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
123f0 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
12400 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
12410 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
12420 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
12430 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
12440 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
12450 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
12460 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
12470 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
12480 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
12490 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
124a0 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
124b0 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
124c0 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
124d0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
124e0 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
124f0 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
12500 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
12510 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
12520 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
12530 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
12540 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
12550 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
12560 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
12570 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
12580 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
12590 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
125a0 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
125b0 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
125c0 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
125d0 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
125e0 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
125f0 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
12600 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
12610 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
12620 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
12630 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
12640 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
12650 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
12660 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
12670 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
12680 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
12690 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
126a0 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
126b0 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
126c0 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
126d0 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
126e0 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
126f0 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
12700 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
12710 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
12720 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
12730 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
12740 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
12750 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
12760 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61  dif...return(sta
12770 74 75 73 29 3b 0a 7d 0a                          tus);.}.