Hex Artifact Content

Artifact 55d19f65b6c1f826f62c3fada88c3e9d261345495116c0052a3752c3188efba0:


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 73 74 72 69 6e 67 3b 0a 20   char *string;. 
1670: 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 20     int length;. 
1680: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d     SSL   *ssl..=
1690: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52   (SSL*)X509_STOR
16a0: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74  E_CTX_get_ex_dat
16b0: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65  a(ctx, SSL_get_e
16c0: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52  x_data_X509_STOR
16d0: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20  E_CTX_idx());.  
16e0: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d    X509  *cert..=
16f0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
1700: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74  get_current_cert
1710: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65  (ctx);.    State
1720: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
1730: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1740: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20  _data(ssl);.    
1750: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1760: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1770: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64  nterp;.    int d
1780: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f  epth..= X509_STO
1790: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72  RE_CTX_get_error
17a0: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20  _depth(ctx);.   
17b0: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39   int err..= X509
17c0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
17d0: 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 20 20 69  rror(ctx);.    i
17e0: 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70  nt code;..    dp
17f0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
1800: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
1810: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
1820: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
1830: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73  *)NULL) {..if (s
1840: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20  tatePtr->vflags 
1850: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  & SSL_VERIFY_FAI
1860: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
1870: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  T) {..    return
1880: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   ok;..} else {..
1890: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d      return 1;..}
18a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50  .    }..    cmdP
18b0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
18c0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
18d0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54  callback);.    T
18e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
18f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1900: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1910: 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79  tringObj("verify
1920: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
1930: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1940: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1950: 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74  dPtr,..Tcl_NewSt
1960: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1970: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1980: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1990: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
19a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
19b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
19c0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70  cl_NewIntObj(dep
19d0: 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  th));.    Tcl_Li
19e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
19f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1a00: 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62  r, Tls_NewX509Ob
1a10: 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29  j(interp, cert))
1a20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1a30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1a40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1a50: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29  cl_NewIntObj(ok)
1a60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1a70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1a80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1a90: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
1aa0: 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65  j((char*)X509_ve
1ab0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
1ac0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
1ad0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
1ae0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
1af0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
1b00: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
1b10: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1b20: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  r);..    statePt
1b30: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
1b40: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20  TCL_CALLBACK;.. 
1b50: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1b60: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
1b70: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
1b80: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
1b90: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
1ba0: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
1bb0: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
1bc0: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20  {../* It got an 
1bd0: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74  error - reject t
1be0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09  he certificate..
1bf0: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  .*/.#if (TCL_MAJ
1c00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
1c10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
1c20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
1c30: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
1c40: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
1c50: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
1c60: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
1c70: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09   code);.#endif..
1c80: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c  ok = 0;.    } el
1c90: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54  se {..result = T
1ca0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
1cb0: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67  interp);..string
1cc0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1cd0: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20  FromObj(result, 
1ce0: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e  &length);../* An
1cf0: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65   empty result le
1d00: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f  aves verificatio
1d10: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a  n unchanged..*/.
1d20: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e  .if (string != N
1d30: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20  ULL && length > 
1d40: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d  0) {..    code =
1d50: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d60: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  bj(interp, resul
1d70: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66  t, &ok);..    if
1d80: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
1d90: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
1da0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
1db0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
1dc0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63  ERSION < 6)...Tc
1dd0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
1de0: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
1df0: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  ...Tcl_Backgroun
1e00: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
1e10: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
1e20: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20  ...ok = 0;..    
1e30: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54  }..}.    }.    T
1e40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1e50: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74  cmdPtr);..    st
1e60: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
1e70: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   ~(TLS_TCL_CALLB
1e80: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  ACK);..    Tcl_R
1e90: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
1ea0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
1eb0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
1ec0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
1ed0: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  rp);.    return(
1ee0: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75  ok);./* By defau
1ef0: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69  lt, leave verifi
1f00: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  cation unchanged
1f10: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ..*/.}.../*. *--
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f  -. *. * Tls_Erro
1f70: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73  r --. *. *.Calls
1f80: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24   callback with $
1f90: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f  fd and $msg - so
1fa0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61   the callback ca
1fb0: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74  n decide. *.what
1fc0: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f   to do with erro
1fd0: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  rs.. *. * Side e
1fe0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65  ffects:. *.The e
1ff0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  rr field of the 
2000: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74  currently operat
2010: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74  ive State is set
2020: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e  . *.  to a strin
2030: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
2040: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
2050: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a   failure reason.
2060: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
20b0: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a  ls_Error(State *
20c0: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a  statePtr, char *
20d0: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49  msg) {.    Tcl_I
20e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
20f0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2100: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
2110: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
2120: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ode;..    dprint
2130: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
2140: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73    if (msg && *ms
2150: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  g) {..Tcl_SetErr
2160: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
2170: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72  SSL", msg, (char
2180: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20   *)NULL);.    } 
2190: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63  else {..msg = Tc
21a0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
21b0: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
21c0: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c  ult(interp), NUL
21d0: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  L);.    }.    st
21e0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73  atePtr->err = ms
21f0: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  g;..    if (stat
2200: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
2210: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
2220: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
2230: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28  FSIZ];..sprintf(
2240: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65  buf, "SSL channe
2250: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a  l \"%s\": error:
2260: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47   %s",..    Tcl_G
2270: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
2280: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d  atePtr->self), m
2290: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73  sg);..Tcl_SetRes
22a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c  ult(interp, buf,
22b0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
22c0: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
22d0: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
22e0: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
22f0: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
2300: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
2310: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
2320: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
2330: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c  tion(interp, TCL
2340: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a  _ERROR);.#endif.
2350: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20  .return;.    }. 
2360: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
2370: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
2380: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
2390: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
23a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
23b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
23c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
23d0: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a  ("error", -1));.
23e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
23f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2400: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
2410: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
2420: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2430: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2440: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2470: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2480: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
2490: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  -1));..    Tcl_P
24a0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
24b0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
24c0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
24d0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
24e0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ePtr);..    Tcl_
24f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
2500: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  Ptr);.    code =
2510: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
2520: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2530: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
2540: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d  .    if (code !=
2550: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28   TCL_OK) {.#if (
2560: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
2570: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
2580: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
2590: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
25a0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
25b0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
25c0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
25d0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
25e0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
25f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2600: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63  (cmdPtr);.    Tc
2610: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
2620: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2630: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
2640: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
2650: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  nterp);.}.../*. 
2660: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
26b0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
26c0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
26d0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
26e0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
26f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
2700: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  one. *----------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
2750: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63  id KeyLogCallbac
2760: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
2770: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69  , const char *li
2780: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ne) {.    char *
2790: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c  str = getenv(SSL
27a0: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20  KEYLOGFILE);.   
27b0: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69   FILE *fd;.    i
27c0: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20  f (str) {..fd = 
27d0: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b  fopen(str, "a");
27e0: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25  ..fprintf(fd, "%
27f0: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c  s\n",line);..fcl
2800: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d  ose(fd);.    }.}
2810: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2860: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62  * Password Callb
2870: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ack --. *. *.Cal
2880: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77  led when a passw
2890: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f  ord is needed to
28a0: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20   unpack RSA and 
28b0: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61  PEM keys.. *.Eva
28c0: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73  ls any bound pas
28d0: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64  sword script and
28e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73   returns the res
28f0: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61  ult as. *.the pa
2900: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20  ssword string.. 
2910: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
2960: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
2970: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
2980: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65  int size, int ve
2990: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74  rify, void *udat
29a0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
29b0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
29c0: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
29d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
29e0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
29f0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
2a00: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
2a10: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64  int code;..    d
2a20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
2a30: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2a40: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d  Ptr->password ==
2a50: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63   NULL) {..if (Tc
2a60: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c  l_EvalEx(interp,
2a70: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
2a80: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
2a90: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b  LOBAL) == TCL_OK
2aa0: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72  ) {..    char *r
2ab0: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
2ac0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
2ad0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20  t(interp);..    
2ae0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
2af0: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29  , (size_t) size)
2b00: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
2b10: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a  nt)strlen(ret);.
2b20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2b30: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20  eturn -1;..}.   
2b40: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   }..    cmdPtr =
2b50: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
2b60: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
2b70: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  word);..    Tcl_
2b80: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
2b90: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
2ba0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
2bb0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2bc0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  tePtr);..    Tcl
2bd0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2be0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
2bf0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
2c00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c10: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
2c20: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
2c30: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
2c40: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
2c50: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
2c60: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
2c70: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
2c80: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
2c90: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
2ca0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
2cb0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
2cc0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2cd0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2ce0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
2cf0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
2d00: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2d10: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64  r);..    if (cod
2d20: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
2d30: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61  char *ret = (cha
2d40: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69  r *) Tcl_GetStri
2d50: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
2d60: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65  ;..if (strlen(re
2d70: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b  t) < size - 1) {
2d80: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75  ..    strncpy(bu
2d90: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
2da0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c   size);..    Tcl
2db0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
2dc0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
2dd0: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
2de0: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a  strlen(ret);..}.
2df0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65      }.    Tcl_Re
2e00: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
2e10: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
2e20: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69  return -1;..veri
2e30: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c  fy = verify;.}..
2e40: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2e90: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
2ea0: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
2eb0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
2ec0: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
2ed0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2ee0: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e  cache. In TLS 1.
2ef0: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65  3. *.this may be
2f00: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
2f10: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74  le times after t
2f20: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f  he handshake. Fo
2f30: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72  r. *.earlier ver
2f40: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c  sions, this will
2f50: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72   be received dur
2f60: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ing the handshak
2f70: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68  e.. *.This is th
2f80: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20  e preferred way 
2f90: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75  to obtain a resu
2fa0: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20  mable session.. 
2fb0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2fc0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
2fd0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
2fe0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
2ff0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
3000: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
3010: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20  0 = error where 
3020: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20  session will be 
3030: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f  immediately remo
3040: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ved from the int
3050: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09  ernal cache.. *.
3060: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72  1 = success wher
3070: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65  e app retains se
3080: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e  ssion in session
3090: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74   cache, and must
30a0: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f   call SSL_SESSIO
30b0: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f  N_free() when do
30c0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3110: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73  .static int.Sess
3120: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ionCallback(cons
3130: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f  t SSL *ssl, SSL_
3140: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
3150: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
3160: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
3170: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
3180: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
3190: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
31a0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
31b0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
31c0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
31d0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
31e0: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
31f0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
3200: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
3210: 6e 5f 69 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f  n_id;.    int co
3220: 64 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  de;.    size_t l
3230: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  en2;.    unsigne
3240: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20  d int ulen;..   
3250: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3260: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3270: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3280: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
3290: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
32a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
32b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
32c0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
32d0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
32e0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
32f0: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  }..    cmdPtr = 
3300: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
3310: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
3320: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
3330: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3340: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3350: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3360: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
3370: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73  1));..    /* Ses
3380: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73  sion id */.    s
3390: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
33a0: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73  SESSION_get_id(s
33b0: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
33c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
33d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
33e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
33f0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
3400: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e  (session_id, (in
3410: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20  t) ulen));..    
3420: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
3430: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53  t */.    SSL_SES
3440: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
3450: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
3460: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54  t, &len2);.    T
3470: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3480: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3490: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
34a0: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b  yteArrayObj(tick
34b0: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29  et, (int) len2))
34c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69  ;..    /* Lifeti
34d0: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73  me - number of s
34e0: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63  econds */.    Tc
34f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3500: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3510: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c  mdPtr,..Tcl_NewL
3520: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53  ongObj((long) SS
3530: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
3540: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
3550: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  nt(session)));..
3560: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3570: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3580: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
3590: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
35a0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
35b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
35c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
35d0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
35e0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
35f0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
3600: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66  _GLOBAL);.    if
3610: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
3620: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
3630: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
3640: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
3650: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
3660: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
3670: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
3680: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3690: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
36a0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
36b0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
36c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
36d0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
36e0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
36f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
3700: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3710: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
3720: 3b 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ;    return 0;.}
3730: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3780: 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20  * ALPN Callback 
3790: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
37a0: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72  *. *.Perform ser
37b0: 76 65 72 2d 73 69 64 65 20 70 72 6f 74 6f 63 6f  ver-side protoco
37c0: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c  l (http/1.1, h2,
37d0: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63   h3, etc.) selec
37e0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09  tion for the. *.
37f0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74  incoming connect
3800: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65  ion. Called afte
3810: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76  r Hello and serv
3820: 65 72 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 0a  er callbacks. *.
3830: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
3840: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
3850: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
3860: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
3870: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
3880: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
3890: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
38a0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73   ALPN protocol s
38b0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
38c0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
38d0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
38e0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
38f0: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f  : There was no o
3900: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74  verlap between t
3910: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20  he client's. *. 
3920: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74     supplied list
3930: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20   and the server 
3940: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
3950: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
3960: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20  ll be aborted.. 
3970: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
3980: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f  _NOACK: ALPN pro
3990: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
39a0: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73  ed, e.g., becaus
39b0: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20  e no ALPN. *.   
39c0: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63   protocols are c
39d0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
39e0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  is connection. T
39f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
3a00: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
3a60: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f  .ALPNCallback(co
3a70: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
3a80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3a90: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65  r **out, unsigne
3aa0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a  d char *outlen,.
3ab0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
3ac0: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e  char *in, unsign
3ad0: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f  ed int inlen, vo
3ae0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
3af0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
3b00: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
3b10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3b20: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3b30: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3b40: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
3b50: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
3b60: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
3b70: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
3b80: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
3b90: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
3ba0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
3bb0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
3bc0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
3bd0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
3be0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
3bf0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
3c00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3c10: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
3c20: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
3c30: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
3c40: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61  out, outlen, sta
3c50: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73  tePtr->protos, s
3c60: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
3c70: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29  len,..in, inlen)
3c80: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f   == OPENSSL_NPN_
3c90: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 72  NEGOTIATED) {..r
3ca0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
3cb0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
3cc0: 73 65 20 7b 0a 09 2f 2a 20 4e 6f 20 6f 76 65 72  se {../* No over
3cd0: 6c 61 70 2c 20 73 6f 20 66 69 72 73 74 20 63 6c  lap, so first cl
3ce0: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 75 73  ient protocol us
3cf0: 65 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c  ed */..res = SSL
3d00: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
3d10: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d  K;.    }..    cm
3d20: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3d30: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3d40: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3d50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3d60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3d70: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3d80: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
3d90: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3da0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3db0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3dc0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3dd0: 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29  ingObj(*out, -1)
3de0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
3df0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3e00: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3e10: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3e20: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3e30: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63  r);..    Tcl_Inc
3e40: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3e50: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
3e60: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
3e70: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
3e80: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3e90: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
3ea0: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
3eb0: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
3ec0: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
3ed0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
3ee0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3ef0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
3f00: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
3f10: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
3f20: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
3f30: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  if.    }.    Tcl
3f40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3f50: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
3f60: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3f70: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3f80: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3f90: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3fa0: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  erp);.    return
3fb0: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c  --. *. * SNI Cal
4010: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
4020: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
4030: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53  rm server-side S
4040: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65  NI hostname sele
4050: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65  ction after rece
4060: 69 76 69 6e 67 20 53 4e 49 20 68 65 61 64 65 72  iving SNI header
4070: 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 61 66 74 65  .. *.Called afte
4080: 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b  r hello callback
4090: 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e   but before ALPN
40a0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
40b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
40c0: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
40d0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
40e0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
40f0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4100: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4110: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53  TLSEXT_ERR_OK: S
4120: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  NI hostname is a
4130: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e  ccepted. The con
4140: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4150: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
4160: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
4170: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
4180: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20  s not accepted. 
4190: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  The connection. 
41a0: 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64  *.    is aborted
41b0: 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c  . Default for al
41c0: 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e  ert is SSL_AD_UN
41d0: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e  RECOGNIZED_NAME.
41e0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
41f0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
4200: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
4210: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20  s not accepted, 
4220: 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a  warning alert. *
4230: 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 69  .    sent (not i
4240: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20  n TLSv1.3). The 
4250: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4260: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4270: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53  EXT_ERR_NOACK: S
4280: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
4290: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20  ot accepted and 
42a0: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64  not acknowledged
42b0: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66  ,. *.    e.g. if
42c0: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65   SNI has not bee
42d0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68  n configured. Th
42e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
42f0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4340: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
4350: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  SNICallback(cons
4360: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
4370: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72  *alert, void *ar
4380: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
4390: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
43a0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
43b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
43c0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
43d0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
43e0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
43f0: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
4400: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c  servername = NUL
4410: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  L;..    dprintf(
4420: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
4430: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
4440: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
4450: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
4460: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4470: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4480: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c  e if (ssl == NUL
4490: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
44a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
44b0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65  K;.    }..    se
44c0: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67  rvername = SSL_g
44d0: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
44e0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
44f0: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20  PE_host_name);. 
4500: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61     if (!serverna
4510: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65  me || servername
4520: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 20  [0] == '\0') {. 
4530: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53         return SS
4540: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
4550: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  CK;.    }..    c
4560: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
4570: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
4580: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
4590: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
45b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
45c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69  ewStringObj("sni
45d0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
45e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
45f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4600: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
4610: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d  ingObj(servernam
4620: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  e , -1));..    T
4630: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
4640: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
4650: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
4660: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
4670: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
4680: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4690: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
46a0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
46b0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
46c0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
46d0: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
46e0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
46f0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
4700: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
4710: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
4720: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
4730: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
4740: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
4750: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
4760: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
4770: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
4780: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4790: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
47a0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
47b0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
47c0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
47d0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
47e0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
47f0: 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45   return SSL_TLSE
4800: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  XT_ERR_OK;.}.../
4810: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 65  -------. *. * He
4860: 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61  llo Handshake Ca
4870: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
4880: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64  rs --. *. *.Used
4890: 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78   by server to ex
48a0: 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72  amine the server
48b0: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e   name indication
48c0: 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e   (SNI) extension
48d0: 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20  . *.provided by 
48e0: 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72  the client in or
48f0: 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e  der to select an
4900: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72   appropriate cer
4910: 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70  tificate to. *.p
4920: 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65  resent, and make
4930: 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61   other configura
4940: 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73  tion adjustments
4950: 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61   relevant to tha
4960: 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65  t server. *.name
4970: 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75   and its configu
4980: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63  ration. This inc
4990: 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f  ludes swapping o
49a0: 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
49b0: 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69  d. *.SSL_CTX poi
49c0: 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20  nter, modifying 
49d0: 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73  the server's lis
49e0: 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54  t of permitted T
49f0: 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09  LS versions,. *.
4a00: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72  changing the ser
4a10: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73  ver's cipher lis
4a20: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  t in response to
4a30: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69   the client's ci
4a40: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a  pher list, etc..
4a50: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4a60: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4a70: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4a80: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4a90: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4aa0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4ab0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
4ac0: 4f 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 6e  O_RETRY = suspen
4ad0: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c  d the handshake,
4ae0: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61   and the handsha
4af0: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ke function will
4b00: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
4b10: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  ely. *.SSL_CLIEN
4b20: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20  T_HELLO_ERROR = 
4b30: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61  failure, termina
4b40: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53  te connection. S
4b50: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f  et alert to erro
4b60: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43  r code.. *.SSL_C
4b70: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
4b80: 45 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 2a  ESS = success. *
4b90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4be0: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62  c int.HelloCallb
4bf0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
4c00: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20  sl, int *alert, 
4c10: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
4c20: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4c30: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
4c40: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4c50: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4c60: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4c70: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4c80: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
4c90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
4ca0: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  rvername;.    co
4cb0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4cc0: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74  r *p;.    size_t
4cd0: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b   len, remaining;
4ce0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4cf0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4d00: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
4d10: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
4d20: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
4d30: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
4d40: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
4d50: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4d60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4d70: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
4d80: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
4d90: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65  .    /* Get name
4da0: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53  s */.    if (!SS
4db0: 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67  L_client_hello_g
4dc0: 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53  et0_ext(ssl, TLS
4dd0: 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f  EXT_TYPE_server_
4de0: 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69  name, &p, &remai
4df0: 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69  ning) || remaini
4e00: 6e 67 20 3c 3d 20 32 29 20 7b 0a 20 20 20 20 20  ng <= 2) {.     
4e10: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c     return SSL_CL
4e20: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
4e30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4e40: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
4e50: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
4e60: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
4e70: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
4e80: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
4e90: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
4ea0: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
4eb0: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
4ec0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ed0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
4ee0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
4ef0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
4f00: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c  n;..    /* The l
4f10: 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20  ist in practice 
4f20: 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c  only has a singl
4f30: 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65  e element, so we
4f40: 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74   only consider t
4f50: 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f  he first one. */
4f60: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69  .    if (remaini
4f70: 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20  ng == 0 || *p++ 
4f80: 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  != TLSEXT_NAMETY
4f90: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a  PE_host_name) {.
4fa0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4fb0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
4fc0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
4fd0: 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20   remaining--;.. 
4fe0: 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e     /* Now we can
4ff0: 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75   finally pull ou
5000: 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79  t the byte array
5010: 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c   with the actual
5020: 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20   hostname. */.  
5030: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20    if (remaining 
5040: 3c 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20  <= 2) {.        
5050: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
5060: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
5070: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28     }.    len = (
5080: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
5090: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
50a0: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
50b0: 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a   > remaining) {.
50c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
50d0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
50e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
50f0: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
5100: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ;.    servername
5110: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
5120: 29 70 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20  )p;..    cmdPtr 
5130: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5140: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
5150: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
5160: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5170: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5180: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5190: 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d  ngObj("hello", -
51a0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
51b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
51c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
51d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
51e0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28  bj(servername, (
51f0: 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20  int) len));..   
5200: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
5210: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
5220: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
5230: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
5240: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
5250: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5260: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
5270: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
5280: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
5290: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
52a0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
52b0: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode != TCL_OK) {
52c0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
52d0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
52e0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
52f0: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
5300: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
5310: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
5320: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
5330: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
5340: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
5350: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5360: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5370: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
5380: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
5390: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
53a0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
53b0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
53c0: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c     return SSL_CL
53d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
53e0: 53 53 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  SS;.}.../*******
53f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
5400: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20  * Commands      
5410: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
5420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
5430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
5480: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
5490: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
54a0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
54b0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
54c0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
54d0: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
54e0: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
54f0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
5500: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
5510: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
5520: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
5530: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
5540: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
5550: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
5560: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
5570: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
5580: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
5590: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
55e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
55f0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
5600: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22  ] = {.."ssl2", "
5610: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
5620: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
5630: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
5640: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
5650: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
5660: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
5670: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
5680: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
5690: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
56a0: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
56b0: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
56c0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
56d0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
56e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
56f0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
5700: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
5710: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
5720: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tr = NULL;.    S
5730: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
5740: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  LL;.    SSL *ssl
5750: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41   = NULL;.    STA
5760: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52  CK_OF(SSL_CIPHER
5770: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20  ) *sk;.    char 
5780: 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d  *cp, buf[BUFSIZ]
5790: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
57a0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
57b0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
57c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
57d0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
57e0: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20   ((objc < 2) || 
57f0: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54  (objc > 4)) {..T
5800: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5810: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
5820: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62   "protocol ?verb
5830: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f  ose? ?supported?
5840: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
5850: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
5860: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
5870: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
5880: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63   objv[1], protoc
5890: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  ols, "protocol",
58a0: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
58b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
58c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
58d0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
58e0: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 2) && Tcl_GetB
58f0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
5900: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
5910: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f  verbose) != TCL_
5920: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
5930: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
5940: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33     if ((objc > 3
5950: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
5960: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
5970: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65  p, objv[3], &use
5980: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54  _supported) != T
5990: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
59a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
59b0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
59c0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73  _error();..    s
59d0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
59e0: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09  tocol)index) {..
59f0: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23  case TLS_SSL2:.#
5a00: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
5a10: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
5a20: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
5a30: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
5a40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
5a50: 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63  NO_SSL2)..    Tc
5a60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5a70: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
5a80: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
5a90: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
5aa0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
5ab0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5ac0: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74  R;.#else..    ct
5ad0: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
5ae0: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b  SSLv2_method());
5af0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
5b00: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23  case TLS_SSL3:.#
5b10: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
5b20: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
5b30: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
5b40: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
5b50: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
5b60: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
5b70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5b80: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
5b90: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
5ba0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
5bb0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
5bc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
5bd0: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53  se..    ctx = SS
5be0: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f  L_CTX_new(SSLv3_
5bf0: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
5c00: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
5c10: 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66  LS_TLS1:.#if def
5c20: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
5c30: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
5c40: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  _NO_TLS1) || def
5c50: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
5c60: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  TLS1_METHOD)..  
5c70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5c80: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
5c90: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
5ca0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
5cb0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
5cc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5cd0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
5ce0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
5cf0: 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64  new(TLSv1_method
5d00: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
5d10: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
5d20: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_1:.#if defined
5d30: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
5d40: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5d50: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
5d60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
5d70: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_1_METHOD)..
5d80: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
5d90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
5da0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
5db0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
5dc0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
5dd0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
5de0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
5df0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
5e00: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65  X_new(TLSv1_1_me
5e10: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
5e20: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
5e30: 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66  _TLS1_2:.#if def
5e40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
5e50: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
5e60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  SL_NO_TLS1_2) ||
5e70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
5e80: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
5e90: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
5ea0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5eb0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
5ec0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
5ed0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
5ee0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
5ef0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
5f00: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53  se..    ctx = SS
5f10: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
5f20: 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  2_method()); bre
5f30: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
5f40: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
5f50: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
5f60: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
5f70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
5f80: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
5f90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5fa0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
5fb0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
5fc0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
5fd0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
5fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
5ff0: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c  e..    ctx = SSL
6000: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74  _CTX_new(TLS_met
6010: 68 6f 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20  hod());.        
6020: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
6030: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
6040: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
6050: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c  RSION);..    SSL
6060: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
6070: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
6080: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
6090: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e  ..    break;.#en
60a0: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  dif..default:.. 
60b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
60c0: 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e      if (ctx == N
60d0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
60e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
60f0: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29   REASON(), NULL)
6100: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6110: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
6120: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74  ssl = SSL_new(ct
6130: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  x);.    if (ssl 
6140: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
6150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6160: 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  erp, REASON(), N
6170: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
6180: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
6190: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
61a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
61b0: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
61c0: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
61d0: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
61e0: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
61f0: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
6200: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
6210: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
6220: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
6230: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
6240: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
6250: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
6260: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
6270: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
6280: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
6290: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
62a0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
62b0: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66  0, NULL);..    f
62c0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
62d0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
62e0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b  _num(sk); i++) {
62f0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50  ...const SSL_CIP
6300: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f  HER *c = sk_SSL_
6310: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c  CIPHER_value(sk,
6320: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20   i);...if (c == 
6330: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NULL) continue;.
6340: 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d  .../* cipher nam
6350: 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09  e or (NONE) */..
6360: 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  .cp = SSL_CIPHER
6370: 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09  _get_name(c);...
6380: 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20  if (cp == NULL) 
6390: 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73  break;...Tcl_Lis
63a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
63b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
63c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
63d0: 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20  bj(cp, -1));..  
63e0: 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
63f0: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
6400: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
6410: 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  ,0);..    for (i
6420: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
6430: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
6440: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
6450: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
6460: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
6470: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
6480: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
6490: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
64a0: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70   textual descrip
64b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68  tion of the ciph
64c0: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f  er */...if (SSL_
64d0: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69  CIPHER_descripti
64e0: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f  on(c, buf, sizeo
64f0: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
6500: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
6510: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c  endToObj(objPtr,
6520: 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 72 6c   buf, (int) strl
6530: 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c  en(buf));...} el
6540: 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41  se {...    Tcl_A
6550: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74  ppendToObj(objPt
6560: 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20  r, "UNKNOWN\n", 
6570: 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  8);...}..    }..
6580: 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f  }..if (use_suppo
6590: 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f  rted) {..    sk_
65a0: 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28  SSL_CIPHER_free(
65b0: 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  sk);..}.    }.  
65c0: 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b    SSL_free(ssl);
65d0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
65e0: 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c  e(ctx);..    Tcl
65f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
6600: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
6610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
6620: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
6630: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
6640: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
6690: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d  rotocolsObjCmd -
66a0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
66b0: 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a   protocols. *. *
66c0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
66d0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
66e0: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
66f0: 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61  protocols" comma
6700: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76  nd. *.to list av
6710: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  ailable protocol
6720: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
6730: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
6740: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  Tcl result list.
6750: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6760: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  cts:. *.none. *.
6770: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
67c0: 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62   int.ProtocolsOb
67d0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
67e0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
67f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6800: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6810: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6820: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
6830: 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  objPtr;..    dpr
6840: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
6850: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
6860: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
6870: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6880: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
6890: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
68a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
68b0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
68c0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23  Obj(0, NULL);..#
68d0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
68e0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
68f0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
6900: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
6910: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
6920: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63  _NO_SSL2).    Tc
6930: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6940: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
6950: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
6960: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
6970: 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29  s[TLS_SSL2], -1)
6980: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
6990: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
69a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
69b0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
69c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
69d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
69e0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
69f0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
6a00: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20  cols[TLS_SSL3], 
6a10: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
6a20: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
6a30: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
6a40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
6a50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6a60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6a70: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
6a80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
6a90: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
6aa0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
6ab0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
6ac0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
6ad0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
6ae0: 4c 53 31 5f 31 29 0a 20 20 20 20 54 63 6c 5f 4c  LS1_1).    Tcl_L
6af0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6b00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
6b10: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
6b20: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
6b30: 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29  LS_TLS1_1], -1))
6b40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
6b50: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
6b60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
6b70: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
6b80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6b90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6ba0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
6bb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
6bc0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
6bd0: 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _2], -1));.#endi
6be0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
6bf0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
6c00: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
6c10: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c  _TLS1_3).    Tcl
6c20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6c30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
6c40: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
6c50: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
6c60: 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31  [TLS_TLS1_3], -1
6c70: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ));.#endif..    
6c80: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6c90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
6ca0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6cb0: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
6cc0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
6cd0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6d20: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  * HandshakeObjCm
6d30: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
6d40: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
6d50: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65  to verify whethe
6d60: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  r the handshake 
6d70: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f  is complete. *.o
6d80: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  r not.. *. * Res
6d90: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6da0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
6db0: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b  1 means handshak
6dc0: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65  e complete, 0 me
6dd0: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a  ans pending.. *.
6de0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6df0: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53  . *.May force SS
6e00: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f  L negotiation to
6e10: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a   take place.. *.
6e20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
6e70: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62   int HandshakeOb
6e80: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
6e90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
6ea0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6eb0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6ec0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6ed0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
6ee0: 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20  el chan;        
6ef0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
6f00: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
6f10: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
6f20: 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20  tatePtr;        
6f30: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
6f40: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
6f50: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
6f60: 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b   *errStr = NULL;
6f70: 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31  .    int ret = 1
6f80: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20  ;.    int err = 
6f90: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
6fa0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6fb0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
6fc0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
6fd0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
6fe0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
6ff0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
7000: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  R);.    }..    c
7010: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
7020: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
7030: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
7040: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
7050: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
7060: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
7070: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
7080: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
7090: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
70a0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
70b0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
70c0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
70d0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
70e0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
70f0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
7100: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
7110: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
7120: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
7130: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7140: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
7150: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
7160: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
7170: 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ), "\": not a TL
7180: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
7190: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
71a0: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  RROR);.    }.   
71b0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
71c0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
71d0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
71e0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69  chan);..    dpri
71f0: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73  ntf("Calling Tls
7200: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22  _WaitForConnect"
7210: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73  );.    ret = Tls
7220: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
7230: 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20  statePtr, &err, 
7240: 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  1);.    dprintf(
7250: 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e  "Tls_WaitForConn
7260: 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69  ect returned: %i
7270: 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66  ", ret);..    if
7280: 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73   (ret < 0 && ((s
7290: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
72a0: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20   TLS_TCL_ASYNC) 
72b0: 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49  && (err == EAGAI
72c0: 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  N))) {..dprintf(
72d0: 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65  "Async set and e
72e0: 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09  rr = EAGAIN");..
72f0: 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65  ret = 0;.    } e
7300: 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29  lse if (ret < 0)
7310: 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61   {..errStr = sta
7320: 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c  tePtr->err;..Tcl
7330: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
7340: 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  erp);..Tcl_SetEr
7350: 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28  rno(err);...if (
7360: 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72  !errStr || (*err
7370: 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20  Str == 0)) {..  
7380: 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50    errStr = Tcl_P
7390: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
73a0: 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65  );..}...Tcl_Appe
73b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
73c0: 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c   "handshake fail
73d0: 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28  ed: ", errStr, (
73e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
73f0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
7400: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
7410: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
7420: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
7430: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
7440: 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ROR);.    } else
7450: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30   {..if (err != 0
7460: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
7470: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
7480: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20  ith a completed 
7490: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d  handshake: err =
74a0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09   %i", err);..}..
74b0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ret = 1;.    }..
74c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
74d0: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69  urning TCL_OK wi
74e0: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c  th data \"%i\"",
74f0: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53   ret);.    Tcl_S
7500: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
7510: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
7520: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74  j(ret));.    ret
7530: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c  urn(TCL_OK);..cl
7540: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
7550: 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  tData;.}../*. *-
7560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
75b0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
75c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
75d0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
75e0: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
75f0: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
7600: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
7610: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
7620: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
7630: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
7640: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
7650: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
7660: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
7670: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
7680: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
7690: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
76a0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
76f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  /.static int.Imp
7700: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
7710: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
7720: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7730: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
7740: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
7750: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
7760: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
7770: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
7780: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
7790: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
77a0: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
77b0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
77c0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   socket */.    S
77d0: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20  SL_CTX *ctx.    
77e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
77f0: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
7800: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7810: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
7820: 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20  sword.        = 
7830: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
7840: 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e  tring upperChann
7850: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75  elTranslation, u
7860: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
7870: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
7880: 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72  lEncoding, upper
7890: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a  ChannelEOFChar;.
78a0: 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e      int idx, len
78b0: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09  ;.    int flags.
78c0: 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54  .        = TLS_T
78d0: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
78e0: 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20 20   server..       
78f0: 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e   = 0;./* is conn
7900: 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20  ection incoming 
7910: 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a  or outgoing? */.
7920: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c      char *keyfil
7930: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
7940: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74  ;.    char *cert
7950: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
7960: 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ULL;.    unsigne
7970: 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20  d char *key  .= 
7980: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65  NULL;.    int ke
7990: 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  y_len           
79a0: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75        = 0;.    u
79b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
79c0: 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt         = NUL
79d0: 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f  L;.    int cert_
79e0: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
79f0: 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72     = 0;.    char
7a00: 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 20   *ciphers.      
7a10: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
7a20: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
7a30: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7a40: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
7a50: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
7a60: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69  ;.    char *CAdi
7a70: 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  r..        = NUL
7a80: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70  L;.    char *DHp
7a90: 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20  arams.        = 
7aa0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
7ab0: 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d  model..        =
7ac0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
7ad0: 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20  *servername.    
7ae0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68      = NULL;./* h
7af0: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76  ostname for Serv
7b00: 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69  er Name Indicati
7b10: 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
7b20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
7b30: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c  ession_id = NULL
7b40: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  ;.    Tcl_Obj *a
7b50: 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  lpn..= NULL;.   
7b60: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73   int ssl2 = 0, s
7b70: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sl3 = 0;.    int
7b80: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f   tls1 = 1, tls1_
7b90: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20  1 = 1, tls1_2 = 
7ba0: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20  1, tls1_3 = 1;. 
7bb0: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30     int proto = 0
7bc0: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20  , level = -1;.  
7bd0: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30    int verify = 0
7be0: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72  , require = 0, r
7bf0: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74  equest = 1, post
7c00: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a  _handshake = 0;.
7c10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7c20: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45  lled");..#if OPE
7c30: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
7c40: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
7c50: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  L && !defined(OP
7c60: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26  ENSSL_NO_SSL2) &
7c70: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
7c80: 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  L2) && defined(N
7c90: 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e  O_SSL3) && defin
7ca0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64  ed(NO_TLS1) && d
7cb0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
7cc0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
7cd0: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e  TLS1_2) && defin
7ce0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  ed(NO_TLS1_3).  
7cf0: 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64    ssl2 = 1;.#end
7d00: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
7d10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
7d20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
7d30: 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64  SSL3) && defined
7d40: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66  (NO_SSL2) && def
7d50: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
7d60: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7d70: 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  _1) && defined(N
7d80: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66  O_TLS1_2) && def
7d90: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a  ined(NO_TLS1_3).
7da0: 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65      ssl3 = 1;.#e
7db0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
7dc0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
7dd0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7de0: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d  TLS1).    tls1 =
7df0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
7e00: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
7e10: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7e20: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
7e30: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a      tls1_1 = 0;.
7e40: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
7e50: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
7e60: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7e70: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20  _NO_TLS1_2).    
7e80: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64  tls1_2 = 0;.#end
7e90: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
7ea0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
7eb0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7ec0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31  TLS1_3).    tls1
7ed0: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  _3 = 0;.#endif..
7ee0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
7ef0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
7f00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7f10: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
7f20: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65  ?options?");..re
7f30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7f40: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
7f50: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
7f60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
7f70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7f80: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55  jv[1], NULL), NU
7f90: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
7fa0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
7fb0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
7fc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7fd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
7fe0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
7ff0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
8000: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
8010: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
8020: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
8030: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
8040: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
8050: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70  x++) {..char *op
8060: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8070: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64  gFromObj(objv[id
8080: 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  x], NULL);...if 
8090: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a  (opt[0] != '-').
80a0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50  .    break;...OP
80b0: 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43  TSTR("-cadir", C
80c0: 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22  Adir);..OPTSTR("
80d0: 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65  -cafile", CAfile
80e0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
80f0: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
8100: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
8110: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
8120: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
8130: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
8140: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
8150: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
8160: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
8170: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
8180: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
8190: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
81a0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
81b0: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
81c0: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
81d0: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
81e0: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
81f0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
8200: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
8210: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
8220: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
8230: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
8240: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uire);..OPTBOOL(
8250: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
8260: 65 73 74 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  est);..OPTINT("-
8270: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20  securitylevel", 
8280: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
8290: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
82a0: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
82b0: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
82c0: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
82d0: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
82e0: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
82f0: 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c  TOBJ("-alpn", al
8300: 70 6e 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  pn);..OPTBOOL("-
8310: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f  ssl2", ssl2);..O
8320: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20  PTBOOL("-ssl3", 
8330: 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl3);..OPTBOOL(
8340: 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a  "-tls1", tls1);.
8350: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
8360: 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50  1", tls1_1);..OP
8370: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c  TBOOL("-tls1.2",
8380: 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f   tls1_2);..OPTBO
8390: 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c  OL("-tls1.3", tl
83a0: 73 31 5f 33 29 3b 0a 09 4f 50 54 42 59 54 45 28  s1_3);..OPTBYTE(
83b0: 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63  "-cert", cert, c
83c0: 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 42 59  ert_len);..OPTBY
83d0: 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20  TE("-key", key, 
83e0: 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09 4f 50 54 42  key_len);...OPTB
83f0: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61  AD("option", "-a
8400: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61  lpn, -cadir, -ca
8410: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65  file, -cert, -ce
8420: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c  rtfile, -cipher,
8430: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   -ciphersuites, 
8440: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72  -command, -dhpar
8450: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66  ams, -key, -keyf
8460: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
8470: 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 65  ssword, -require
8480: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 63  , -request, -sec
8490: 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72  uritylevel, -ser
84a0: 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65  ver, -servername
84b0: 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d  , -session_id, -
84c0: 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c  ssl2, -ssl3, -tl
84d0: 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c  s1, -tls1.1, -tl
84e0: 73 31 2e 32 2c 20 6f 72 20 2d 74 6c 73 31 2e 33  s1.2, or -tls1.3
84f0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
8500: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8510: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 20    if (request). 
8520: 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c     verify |= SSL
8530: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
8540: 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59  NCE | SSL_VERIFY
8550: 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72  _PEER;.    if (r
8560: 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72  equest && requir
8570: 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e) verify |= SSL
8580: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
8590: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20  NO_PEER_CERT;.  
85a0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
85b0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
85c0: 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f    verify |= SSL_
85d0: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
85e0: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
85f0: 65 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69  erify == 0).veri
8600: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  fy = SSL_VERIFY_
8610: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f  NONE;..    proto
8620: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f   |= (ssl2 ? TLS_
8630: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b  PROTO_SSL2 : 0);
8640: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73  .    proto |= (s
8650: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  sl3 ? TLS_PROTO_
8660: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70  SSL3 : 0);.    p
8670: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20  roto |= (tls1 ? 
8680: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a  TLS_PROTO_TLS1 :
8690: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
86a0: 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f  = (tls1_1 ? TLS_
86b0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30  PROTO_TLS1_1 : 0
86c0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
86d0: 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52  (tls1_2 ? TLS_PR
86e0: 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b  OTO_TLS1_2 : 0);
86f0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
8700: 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_3 ? TLS_PROT
8710: 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a  O_TLS1_3 : 0);..
8720: 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20      /* reset to 
8730: 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74  NULL if blank st
8740: 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f  ring provided */
8750: 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26  .    if (cert &&
8760: 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20   !*cert)..      
8770: 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d    cert.        =
8780: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b   NULL;.    if (k
8790: 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20  ey && !*key)..  
87a0: 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20        key.      
87b0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
87c0: 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a   (certfile && !*
87d0: 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20  certfile)       
87e0: 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c    certfile.= NUL
87f0: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69  L;.    if (keyfi
8800: 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29  le && !*keyfile)
8810: 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20  ..keyfile.      
8820: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
8830: 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63   (ciphers && !*c
8840: 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20  iphers).        
8850: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
8860: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8870: 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20  ciphersuites && 
8880: 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20  !*ciphersuites) 
8890: 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20  ciphersuites    
88a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
88b0: 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69  CAfile && !*CAfi
88c0: 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69  le).        CAfi
88d0: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
88e0: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72  L;.    if (CAdir
88f0: 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 20   && !*CAdir).   
8900: 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 20       CAdir.     
8910: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
8920: 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21  f (DHparams && !
8930: 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20  *DHparams).     
8940: 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20     DHparams     
8950: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20     = NULL;..    
8960: 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65  /* new SSL state
8970: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
8980: 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b  ..= (State *) ck
8990: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29  alloc((unsigned)
89a0: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b   sizeof(State));
89b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74  .    memset(stat
89c0: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ePtr, 0, sizeof(
89d0: 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74  State));..    st
89e0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20  atePtr->flags.= 
89f0: 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65  flags;.    state
8a00: 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e  Ptr->interp.= in
8a10: 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50  terp;.    stateP
8a20: 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72  tr->vflags.= ver
8a30: 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ify;.    statePt
8a40: 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20  r->err.= "";..  
8a50: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63    /* allocate sc
8a60: 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ript */.    if (
8a70: 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64  script) {..(void
8a80: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
8a90: 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26  romObj(script, &
8aa0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
8ab0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
8ac0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69  >callback = scri
8ad0: 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  pt;..    Tcl_Inc
8ae0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
8af0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
8b00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8b10: 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72  allocate passwor
8b20: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73  d */.    if (pas
8b30: 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29  sword) {..(void)
8b40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8b50: 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20  omObj(password, 
8b60: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
8b70: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
8b80: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73  ->password = pas
8b90: 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f  sword;..    Tcl_
8ba0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
8bb0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
8bc0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
8bd0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
8be0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
8bf0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
8c00: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
8c10: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
8c20: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
8c30: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
8c40: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
8c50: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
8c60: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
8c70: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
8c80: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
8c90: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
8ca0: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  .. * Make sure t
8cb0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
8cc0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
8cd0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  .. */..chan = Tc
8ce0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
8cf0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f  chan);..if (Tcl_
8d00: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
8d10: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
8d20: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20  nelType()) {..  
8d30: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8d40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
8d50: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
8d60: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
8d70: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
8d80: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
8d90: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  , NULL);..    Tl
8da0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
8db0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
8dc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8dd0: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74  ;..}..ctx = ((St
8de0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
8df0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
8e00: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20  (chan))->ctx;.  
8e10: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
8e20: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28  (ctx = CTX_Init(
8e30: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72  statePtr, server
8e40: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65  , proto, keyfile
8e50: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c  , certfile, key,
8e60: 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a   cert, key_len,.
8e70: 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43  .    cert_len, C
8e80: 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69  Adir, CAfile, ci
8e90: 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69  phers, ciphersui
8ea0: 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61  tes, level, DHpa
8eb0: 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  rams)) == NULL) 
8ec0: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
8ed0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
8ee0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
8ef0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
8f00: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74    }..    statePt
8f10: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20  r->ctx = ctx;.. 
8f20: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
8f30: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8f40: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e  e that the chann
8f50: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61  el works in bina
8f60: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20  ry (for the.    
8f70: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f   * encryption no
8f80: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20  t to get goofed 
8f90: 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f  up)..     * We o
8fa0: 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75  nly want to adju
8fb0: 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67  st the buffering
8fc0: 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e   in pre-v2 chann
8fd0: 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20  els, where.     
8fe0: 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69  * each channel i
8ff0: 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e  n the stack main
9000: 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62  tained its own b
9010: 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a  uffers..     */.
9020: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
9030: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
9040: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
9050: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
9060: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
9070: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
9080: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
9090: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
90a0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  har);.    Tcl_DS
90b0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
90c0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
90d0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
90e0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
90f0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68  p, chan, "-eofch
9100: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ar", &upperChann
9110: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
9120: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
9130: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
9140: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  n, "-encoding", 
9150: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
9160: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
9170: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9180: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9190: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26  -translation", &
91a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
91b0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
91c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
91d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
91e0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75   "-blocking", &u
91f0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
9200: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ing);.    Tcl_Se
9210: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9220: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
9230: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69  ranslation", "bi
9240: 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f  nary");.    Tcl_
9250: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9260: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9270: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75  -blocking", "tru
9280: 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  e");.    dprintf
9290: 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20  ("Consuming Tcl 
92a0: 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c  channel %s", Tcl
92b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
92c0: 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74  chan));.    stat
92d0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c  ePtr->self = Tcl
92e0: 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  _StackChannel(in
92f0: 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65  terp, Tls_Channe
9300: 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74  lType(), (Client
9310: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20  Data) statePtr, 
9320: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20  (TCL_READABLE | 
9330: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63  TCL_WRITABLE), c
9340: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  han);.    dprint
9350: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e  f("Created chann
9360: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63  el named %s", Tc
9370: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
9380: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
9390: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
93a0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
93b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
93c0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73   {../*.. * No us
93d0: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61  e of Tcl_Eventua
93e0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20  llyFree because 
93f0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f  no possible Tcl_
9400: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09  Preserve... */..
9410: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
9420: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
9430: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9440: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
9450: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9460: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
9470: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c  ->self, "-transl
9480: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72  ation", Tcl_DStr
9490: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
94a0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
94b0: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  n));.    Tcl_Set
94c0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
94d0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
94e0: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  self, "-encoding
94f0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
9500: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
9510: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20  lEncoding));.   
9520: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9530: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
9540: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
9550: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53  eofchar", Tcl_DS
9560: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
9570: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
9580: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9590: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
95a0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
95b0: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  lf, "-blocking",
95c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
95d0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
95e0: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20  locking));..    
95f0: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e  /*.     * SSL In
9600: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
9610: 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74    */.    statePt
9620: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77  r->ssl = SSL_new
9630: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
9640: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50  .    if (!stateP
9650: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53  tr->ssl) {../* S
9660: 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72  SL library error
9670: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52   */..Tcl_AppendR
9680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
9690: 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63  ouldn't construc
96a0: 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22  t ssl session: "
96b0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  , REASON(), (cha
96c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73  r *) NULL);..Tls
96d0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
96e0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
96f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9700: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68   }..    /* Set h
9710: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ost server name 
9720: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  */.    if (serve
9730: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74  rname) {../* Set
9740: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  s the server nam
9750: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
9760: 49 29 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65  I) ClientHello e
9770: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 20  xtension */..if 
9780: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74  (!SSL_set_tlsext
9790: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65  _host_name(state
97a0: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72  Ptr->ssl, server
97b0: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65  name) && require
97c0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
97d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
97e0: 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68  , "setting TLS h
97f0: 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69  ost name extensi
9800: 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61  on failed", (cha
9810: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  r *) NULL);.    
9820: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65          Tls_Free
9830: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
9840: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
9850: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9860: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f  R;.        }.../
9870: 2a 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76  * Configure serv
9880: 65 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65  er host name che
9890: 63 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63  cks in the SSL c
98a0: 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68  lient. Set DNS h
98b0: 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e  ostname to..   n
98c0: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72  ame for peer cer
98d0: 74 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e  tificate checks.
98e0: 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68   SSL_set1_host h
98f0: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20  as limitations. 
9900: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64  */..if (!SSL_add
9910: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d  1_host(statePtr-
9920: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
9930: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
9940: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9950: 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20  p, "setting DNS 
9960: 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64  host name failed
9970: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
9990: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
99a0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
99b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
99c0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
99d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d   }..    /* Resum
99e0: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  e session id */.
99f0: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f      if (session_
9a00: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73  id && strlen(ses
9a10: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f  sion_id) <= SSL_
9a20: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47  MAX_SID_CTX_LENG
9a30: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65  TH) {../* SSL_se
9a40: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09  t_session() */..
9a50: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e  if (!SSL_SESSION
9a60: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74  _set1_id_context
9a70: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e  (SSL_get_session
9a80: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
9a90: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e   session_id, (un
9aa0: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c  signed int) strl
9ab0: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29  en(session_id)))
9ac0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
9ad0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9ae0: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e   "Resume session
9af0: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69   id ", session_i
9b00: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63  d, " failed", (c
9b10: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
9b20: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
9b30: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
9b40: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
9b50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9b60: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
9b70: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09     if (alpn) {..
9b80: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c  /* Convert a Tcl
9b90: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f   list into a pro
9ba0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69  tocol-list in wi
9bb0: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e  re-format */..un
9bc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
9bd0: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e  tos, *p;..unsign
9be0: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65  ed int protos_le
9bf0: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c  n = 0;..int i, l
9c00: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62  en, cnt;..Tcl_Ob
9c10: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28  j **list;...if (
9c20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
9c30: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61  ements(interp, a
9c40: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  lpn, &cnt, &list
9c50: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
9c60: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
9c70: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
9c80: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
9c90: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
9ca0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
9cb0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
9cc0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
9cd0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
9ce0: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
9cf0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
9d00: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
9d10: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
9d20: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
9d30: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
9d40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9d50: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
9d60: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
9d70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
9d80: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
9d90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72  ) statePtr);...r
9da0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9db0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f  ..    }..    pro
9dc0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c  tos_len += 1 + l
9dd0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c  en;..}.../* Buil
9de0: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70  d the complete p
9df0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
9e00: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f  .protos = ckallo
9e10: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09  c(protos_len);..
9e20: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  /* protocol-list
9e30: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62  s consist of 8-b
9e40: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78  it length-prefix
9e50: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73  ed, byte strings
9e60: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c   */..for (i = 0,
9e70: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c   p = protos; i <
9e80: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
9e90: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63    char *str = Tc
9ea0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9eb0: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e  bj(list[i], &len
9ec0: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c  );..    *p++ = l
9ed0: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28  en;..    memcpy(
9ee0: 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20  p, str, len);.. 
9ef0: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a     p += len;..}.
9f00: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70  ../* SSL_set_alp
9f10: 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61  n_protos makes a
9f20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f   copy of the pro
9f30: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f  tocol-list */../
9f40: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e  * Note: This fun
9f50: 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20  ctions reverses 
9f60: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9f70: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09   convention */..
9f80: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  if (SSL_set_alpn
9f90: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72  _protos(statePtr
9fa0: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70  ->ssl, protos, p
9fb0: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20  rotos_len)) {.. 
9fc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9fd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69  ult(interp, "fai
9fe0: 6c 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20  led to set ALPN 
9ff0: 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61  protocols", (cha
a000: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a010: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
a020: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a030: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73     ckfree(protos
a040: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
a050: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
a060: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c  * Store protocol
a070: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65  s list */..state
a080: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72  Ptr->protos = pr
a090: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d  otos;..statePtr-
a0a0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72  >protos_len = pr
a0b0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
a0c0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
a0d0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
a0e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
a0f0: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  os_len = 0;.    
a100: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
a110: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20   SSL Callbacks. 
a120: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73      */.    SSL_s
a130: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74  et_app_data(stat
a140: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
a150: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a   *)statePtr);./*
a160: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75   point back to u
a170: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  s */.    SSL_set
a180: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72  _verify(statePtr
a190: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56  ->ssl, verify, V
a1a0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a  erifyCallback);.
a1b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
a1c0: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
a1d0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66  atePtr->ctx, Inf
a1e0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20  oCallback);..   
a1f0: 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43   /* Create Tcl_C
a200: 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c  hannel BIO Handl
a210: 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  er */.    stateP
a220: 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f  tr->p_bio.= BIO_
a230: 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72  new_tcl(statePtr
a240: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
a250: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69      statePtr->bi
a260: 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o.= BIO_new(BIO_
a270: 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69  f_ssl());..    i
a280: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a  f (server) {../*
a290: 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b   Server callback
a2a0: 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  s */..SSL_CTX_se
a2b0: 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62  t_alpn_select_cb
a2c0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
a2d0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
a2e0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
a2f0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
a300: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
a310: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74  arg(statePtr->ct
a320: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
a330: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  Ptr);..SSL_CTX_s
a340: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
a350: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74  name_callback(st
a360: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49  atePtr->ctx, SNI
a370: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f  Callback);..SSL_
a380: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68  CTX_set_client_h
a390: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72  ello_cb(statePtr
a3a0: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c  ->ctx, HelloCall
a3b0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
a3c0: 61 74 65 50 74 72 29 3b 0a 0a 09 2f 2a 20 45 6e  atePtr);.../* En
a3d0: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
a3e0: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
a3f0: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
a400: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
a410: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20  */..if (request 
a420: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
a430: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65  e) {..    SSL_ve
a440: 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74  rify_client_post
a450: 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65  _handshake(state
a460: 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09  Ptr->ssl);..}...
a470: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
a480: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45  |= TLS_TCL_SERVE
a490: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65  R;..SSL_set_acce
a4a0: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  pt_state(statePt
a4b0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
a4c0: 6c 73 65 20 7b 0a 09 2f 2a 20 53 65 73 73 69 6f  lse {../* Sessio
a4d0: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53  n caching */..SS
a4e0: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f  L_CTX_set_sessio
a4f0: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
a500: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f  tePtr->ctx, SSL_
a510: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
a520: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  T | SSL_SESS_CAC
a530: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53  HE_NO_INTERNAL_S
a540: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  TORE);..SSL_CTX_
a550: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28  sess_set_new_cb(
a560: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
a570: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b  essionCallback);
a580: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73  .../* Enable pos
a590: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68  t handshake Auth
a5a0: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e  entication exten
a5b0: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e  sion. TLS 1.3 on
a5c0: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20  ly, not http/2. 
a5d0: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20  */..if (request 
a5e0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
a5f0: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65  e) {..    SSL_se
a600: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
a610: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e  _auth(statePtr->
a620: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 53 53  ssl, 1);..}...SS
a630: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
a640: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
a650: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  l);.    }.    SS
a660: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50  L_set_bio(stateP
a670: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74  tr->ssl, statePt
a680: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50  r->p_bio, stateP
a690: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20  tr->p_bio);.    
a6a0: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74  BIO_set_ssl(stat
a6b0: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65  ePtr->bio, state
a6c0: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f  Ptr->ssl, BIO_NO
a6d0: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a  CLOSE);..    /*.
a6e0: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53       * End of SS
a6f0: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20  L Init.     */. 
a700: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
a710: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47  rning %s", Tcl_G
a720: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
a730: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
a740: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
a750: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
a760: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
a770: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
a780: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
a790: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ILE);..    retur
a7a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
a7b0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
a7c0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a810: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
a820: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
a830: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
a840: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
a850: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
a860: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
a870: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
a880: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
a890: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
a8a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
a8b0: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
a8c0: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
a8d0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
a8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
a930: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
a940: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
a950: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
a960: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
a970: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
a980: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
a990: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
a9a0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
a9b0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
a9c0: 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70  e on. */..    dp
a9d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
a9e0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
a9f0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
aa00: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
aa10: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
aa20: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
aa30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
aa40: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
aa50: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
aa60: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
aa70: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
aa80: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
aa90: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
aaa0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
aab0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
aac0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
aad0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
aae0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
aaf0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
ab00: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
ab10: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
ab20: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
ab30: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
ab40: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
ab50: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ab60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ab70: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
ab80: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ab90: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
aba0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
abb0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  nel", NULL);..re
abc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abd0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
abe0: 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65  cl_UnstackChanne
abf0: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20  l(interp, chan) 
ac00: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a  == TCL_ERROR) {.
ac10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ac20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  R;.    }..    re
ac30: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
ac40: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
ac50: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
ac60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aca0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e  ---. *. * CTX_In
acb0: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20  it -- construct 
acc0: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  a SSL_CTX instan
acd0: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ce. *. * Results
ace0: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c  :. *.A valid SSL
acf0: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72  _CTX instance or
ad00: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64   NULL.. *. * Sid
ad10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
ad20: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e  nstructs SSL con
ad30: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad80: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53  ---. */.static S
ad90: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69  SL_CTX *.CTX_Ini
ada0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
adb0: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
adc0: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
add0: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20   *keyfile, char 
ade0: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75  *certfile,.    u
adf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
ae00: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
ae10: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f   *cert, int key_
ae20: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65  len, int cert_le
ae30: 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a  n, char *CAdir,.
ae40: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
ae50: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  , char *ciphers,
ae60: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
ae70: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
ae80: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20  char *DHparams) 
ae90: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
aea0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65   *interp = state
aeb0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
aec0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
aed0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
aee0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63  tring ds;.    Tc
aef0: 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20  l_DString ds1;. 
af00: 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a     int off = 0;.
af10: 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69      int load_pri
af20: 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f  vate_key;.    co
af30: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a  nst SSL_METHOD *
af40: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72  method;..    dpr
af50: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
af60: 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29  .    if (!proto)
af70: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
af80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
af90: 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20   valid protocol 
afa0: 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29  selected", NULL)
afb0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
afc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
afd0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
afe0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
aff0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
b000: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
b010: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
b020: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
b030: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
b040: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
b050: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
b060: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
b070: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b080: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
b090: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
b0a0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
b0b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
b0c0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
b0d0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
b0e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
b0f0: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  L3).    if (ENAB
b100: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
b110: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54  ROTO_SSL3)) {..T
b120: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b130: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72  interp, "SSL3 pr
b140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
b150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
b160: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
b170: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
b180: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
b190: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
b1a0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66  _NO_TLS1).    if
b1b0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
b1c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
b1d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
b1e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
b1f0: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
b200: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
b210: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
b220: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
b230: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
b240: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
b250: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
b260: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45  LS1_1).    if (E
b270: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
b280: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29  S_PROTO_TLS1_1))
b290: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
b2a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
b2b0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.1 protocol n
b2c0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
b2d0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
b2e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
b2f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
b300: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
b310: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
b320: 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_2).    if (EN
b330: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
b340: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20  _PROTO_TLS1_2)) 
b350: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
b360: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
b370: 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.2 protocol no
b380: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
b390: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
b3a0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
b3b0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
b3c0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
b3d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
b3e0: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_3).    if (ENA
b3f0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
b400: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b  PROTO_TLS1_3)) {
b410: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b420: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
b430: 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.3 protocol not
b440: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
b450: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
b460: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
b470: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
b480: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
b490: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
b4a0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
b4b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
b4c0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
b4d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
b4e0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
b4f0: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
b500: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
b510: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
b520: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
b530: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
b540: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
b550: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
b560: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
b570: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
b580: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
b590: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
b5a0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
b5b0: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
b5c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
b5d0: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
b5e0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
b5f0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
b600: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
b610: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
b620: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
b630: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b640: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
b650: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
b660: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
b670: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
b680: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
b690: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
b6a0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
b6b0: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
b6c0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
b6d0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
b6e0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
b6f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
b700: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
b710: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
b720: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
b730: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
b740: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
b750: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
b760: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
b770: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
b780: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
b790: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
b7a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
b7b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
b7c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
b7d0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
b7e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
b7f0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
b800: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
b810: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
b820: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
b830: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
b840: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
b850: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
b860: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
b870: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
b880: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
b890: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
b8a0: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
b8b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
b8c0: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
b8d0: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
b8e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
b8f0: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
b900: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
b910: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
b920: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
b930: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
b940: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
b950: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
b960: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
b970: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
b980: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
b990: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
b9a0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
b9b0: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
b9c0: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
b9d0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
b9e0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
b9f0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
ba00: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
ba10: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
ba20: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
ba30: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
ba40: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
ba50: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
ba60: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
ba70: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
ba80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
ba90: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
baa0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
bab0: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
bac0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
bad0: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
bae0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
baf0: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
bb00: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
bb10: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
bb20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
bb30: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
bb40: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
bb50: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
bb60: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
bb70: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
bb80: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
bb90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
bba0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
bbb0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
bbc0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
bbd0: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
bbe0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
bbf0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
bc00: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
bc10: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
bc20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
bc30: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
bc40: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
bc50: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
bc60: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
bc70: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
bc80: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
bc90: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
bca0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
bcb0: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
bcc0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
bcd0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
bce0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
bcf0: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
bd00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
bd10: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
bd20: 72 28 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 53  r();.    ctx = S
bd30: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
bd40: 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74  d);..    if (!ct
bd50: 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  x) {..return(NUL
bd60: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  L);.    }..    i
bd70: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59  f (getenv(SSLKEY
bd80: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c  LOGFILE)) {..SSL
bd90: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f  _CTX_set_keylog_
bda0: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65  callback(ctx, Ke
bdb0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  yLogCallback);. 
bdc0: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
bdd0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
bde0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
bdf0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
be00: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c   if (proto == TL
be10: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
be20: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  {..SSL_CTX_set_m
be30: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
be40: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
be50: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  SION);..SSL_CTX_
be60: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
be70: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
be80: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20  3_VERSION);.    
be90: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
bea0: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65   Force cipher se
beb0: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79  lection order by
bec0: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69   server */.    i
bed0: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a  f (!isServer) {.
bee0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74  .SSL_CTX_set_opt
bef0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
bf00: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50  _CIPHER_SERVER_P
bf10: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20  REFERENCE);.    
bf20: 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
bf30: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c  et_app_data(ctx,
bf40: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b   (void*)interp);
bf50: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65  ./* remember the
bf60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
bf70: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
bf80: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
bf90: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c  _OP_ALL);./* all
bfa0: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f   SSL bug workaro
bfb0: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  unds */.    SSL_
bfc0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
bfd0: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64  ctx, off);../* d
bfe0: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20  isable protocol 
bff0: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20  versions */.#if 
c000: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
c010: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
c020: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58  000L.    SSL_CTX
c030: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53  _set_mode(ctx, S
c040: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54  SL_MODE_AUTO_RET
c050: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e  RY);./* handle n
c060: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e  ew handshakes in
c070: 20 62 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23   background */.#
c080: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54  endif.    SSL_CT
c090: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65  X_sess_set_cache
c0a0: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b  _size(ctx, 128);
c0b0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
c0c0: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72  r defined cipher
c0d0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73  s, cipher suites
c0e0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c  , and security l
c0f0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
c100: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c  (ciphers != NULL
c110: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
c120: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74  t_cipher_list(ct
c130: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09  x, ciphers)) {..
c140: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
c160: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64  t ciphers failed
c170: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
c180: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
c190: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
c1a0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
c1b0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20    return NULL;. 
c1c0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69     }.    if ((ci
c1d0: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55  phersuites != NU
c1e0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
c1f0: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73  set_ciphersuites
c200: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74  (ctx, ciphersuit
c210: 65 73 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  es)) {..    Tcl_
c220: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c230: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
c240: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
c250: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
c260: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
c270: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
c280: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
c290: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
c2a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73   }..    /* Set s
c2b0: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
c2c0: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e  .    if (level >
c2d0: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36   -1 && level < 6
c2e0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
c2f0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a  security_level *
c300: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
c310: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74  ecurity_level(ct
c320: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  x, level);.    }
c330: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
c340: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
c350: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
c360: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
c370: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
c380: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
c390: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
c3a0: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
c3b0: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
c3c0: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  )statePtr);..   
c3d0: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69   /* read a Diffi
c3e0: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65  e-Hellman parame
c3f0: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73  ters file, or us
c400: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f  e the built-in o
c410: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45  ne */.#ifdef OPE
c420: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69  NSSL_NO_DH.    i
c430: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
c440: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
c450: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c460: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73   "DH parameter s
c470: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c  upport not avail
c480: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  able", (char *) 
c490: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
c4a0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
c4b0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
c4c0: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20  else.    {..DH* 
c4d0: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d  dh;..if (DHparam
c4e0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
c4f0: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20    BIO *bio;..   
c500: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
c510: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20  (&ds);..    bio 
c520: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
c530: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
c540: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
c550: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
c560: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
c570: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
c580: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
c590: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
c5a0: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
c5b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c5c0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
c5d0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
c5e0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  NULL;..    }... 
c5f0: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
c600: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
c610: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
c620: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
c630: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
c640: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
c650: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
c660: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
c670: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c680: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
c690: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
c6a0: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
c6b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
c6c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
c6d0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
c6e0: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09     }..} else {..
c6f0: 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50      dh = get_dhP
c700: 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c  arams();..}..SSL
c710: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
c720: 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72  ctx, dh);..DH_fr
c730: 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65  ee(dh);.    }.#e
c740: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74  ndif..    /* set
c750: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65   our certificate
c760: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69   */.    load_pri
c770: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20  vate_key = 0;.  
c780: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21    if (certfile !
c790: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
c7a0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
c7b0: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  ...Tcl_DStringIn
c7c0: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53  it(&ds);...if (S
c7d0: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
c7e0: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
c7f0: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26   F2N(certfile, &
c800: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
c810: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
c820: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
c830: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
c840: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c850: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
c860: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
c870: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
c880: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20  ile, ": ",....  
c890: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
c8a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
c8b0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
c8c0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
c8d0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
c8e0: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d  else if (cert !=
c8f0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
c900: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
c910: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
c920: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e  _certificate_ASN
c930: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c  1(ctx, cert_len,
c940: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09   cert) <= 0) {..
c950: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
c960: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
c970: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c980: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
c990: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
c9a0: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52  te: ",....     R
c9b0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
c9c0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
c9d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
c9e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
c9f0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
ca00: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28   {..certfile = (
ca10: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64  char*)X509_get_d
ca20: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65  efault_cert_file
ca30: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  ();...if (SSL_CT
ca40: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
ca50: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74  e_file(ctx, cert
ca60: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59  file, SSL_FILETY
ca70: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
ca80: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44  #if 0..    Tcl_D
ca90: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
caa0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
cab0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cac0: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65  unable to use de
cad0: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74  fault certificat
cae0: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
caf0: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20  le, ": ",....   
cb00: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
cb10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
cb20: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
cb30: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
cb40: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
cb50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
cb60: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
cb70: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
cb80: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
cb90: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
cba0: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
cbb0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
cbc0: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
cbd0: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
cbe0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
cbf0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
cc00: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
cc10: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
cc20: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
cc30: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
cc40: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
cc50: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
cc60: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
cc70: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
cc80: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
cc90: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
cca0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
ccb0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
ccc0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ccd0: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
cce0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
ccf0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
cd00: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
cd10: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
cd20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
cd30: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
cd40: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cd50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
cd60: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
cd70: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
cd80: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20  file, " ",....  
cd90: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c         REASON(),
cda0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
cdb0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
cdc0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
cdd0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
cde0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
cdf0: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  (&ds);...} else 
ce00: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29  if (key != NULL)
ce10: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f   {..    if (SSL_
ce20: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
ce30: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59  ey_ASN1(EVP_PKEY
ce40: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b  _RSA, ctx, key,k
ce50: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
ce60: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
ce70: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
ce80: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
ce90: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
cea0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
ceb0: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
cec0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
ced0: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
cee0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
cef0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
cf00: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
cf10: 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f  ic key: ", REASO
cf20: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
cf30: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
cf40: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
cf50: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
cf60: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
cf70: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
cf80: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
cf90: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
cfa0: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
cfb0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
cfc0: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
cfd0: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
cfe0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
cff0: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
d000: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
d010: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
d020: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
d030: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
d040: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
d050: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d060: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
d070: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
d080: 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69     /* Set verifi
d090: 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20  cation CAs */.  
d0a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
d0b0: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f  t(&ds);.    Tcl_
d0c0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
d0d0: 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  );.    if (!SSL_
d0e0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
d0f0: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46  locations(ctx, F
d100: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c  2N(CAfile, &ds),
d110: 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31   F2N(CAdir, &ds1
d120: 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f  )) ||..!SSL_CTX_
d130: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
d140: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b  fy_paths(ctx)) {
d150: 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72  .#if 0..Tcl_DStr
d160: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54  ingFree(&ds);..T
d170: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d180: 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20  ds1);../* Don't 
d190: 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69  currently care i
d1a0: 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a  f this fails */.
d1b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d1c0: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64  t(interp, "SSL d
d1d0: 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61  efault verify pa
d1e0: 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  ths: ", REASON()
d1f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d200: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
d210: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
d220: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  LL;.#endif.    }
d230: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f  ..    /* https:/
d240: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  /sourceforge.net
d250: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20  /p/tls/bugs/57/ 
d260: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f  */.    /* XXX:TO
d270: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72  DO: Let the user
d280: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68   supply values h
d290: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ere instead of s
d2a0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78  omething that ex
d2b0: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ists on the file
d2c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66  system */.    if
d2d0: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
d2e0: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35  ) {..STACK_OF(X5
d2f0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
d300: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
d310: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
d320: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
d330: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20  ..if (certNames 
d340: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
d350: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
d360: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
d370: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20  certNames);..}. 
d380: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
d390: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
d3a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
d3b0: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
d3c0: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
d3d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
d3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d410: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
d420: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
d430: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
d440: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
d450: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
d460: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
d470: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
d480: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
d490: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
d4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
d4f0: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
d500: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
d510: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
d520: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
d530: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
d540: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
d550: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
d560: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
d570: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
d580: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
d590: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
d5a0: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
d5b0: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
d5c0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
d5d0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
d5e0: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
d5f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
d600: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a  n;.    int nid;.
d610: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
d620: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69  lled");..    swi
d630: 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61  tch (objc) {..ca
d640: 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e  se 2:..    chann
d650: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  elName = Tcl_Get
d660: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
d670: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20  jv[1], NULL);.. 
d680: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
d690: 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74   3:..    if (!st
d6a0: 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72  rcmp (Tcl_GetStr
d6b0: 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ing (objv[1]), "
d6c0: 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68  -local")) {...ch
d6d0: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
d6e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d6f0: 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b  (objv[2], NULL);
d700: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d  ...break;..    }
d710: 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  ..    /* else fa
d720: 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a  ll-through ... *
d730: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
d740: 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61  GNUC__)..    __a
d750: 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c  ttribute__((fall
d760: 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69  through));.#endi
d770: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
d780: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d790: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
d7a0: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61  v, "?-local? cha
d7b0: 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74  nnel");..    ret
d7c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d7d0: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
d7e0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
d7f0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
d800: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
d810: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
d820: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
d830: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
d840: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
d850: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
d860: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
d870: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
d880: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
d890: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
d8a0: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
d8b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
d8c0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
d8d0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
d8e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d8f0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
d900: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
d910: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
d920: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
d930: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
d940: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
d950: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d960: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
d970: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
d980: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
d990: 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  ata(chan);.    i
d9a0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
d9b0: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
d9c0: 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65  peer_certificate
d9d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
d9e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70  .    } else {..p
d9f0: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65  eer = SSL_get_ce
da00: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
da10: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
da20: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
da30: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
da40: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
da50: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
da60: 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66  c == 2) { X509_f
da70: 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20  ree(peer); }.   
da80: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74   } else {..objPt
da90: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
daa0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
dab0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20   }..    /* Peer 
dac0: 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65  cert chain (clie
dad0: 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20  nt only) */.    
dae0: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20  STACK_OF(X509)* 
daf0: 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f  ssl_certs = SSL_
db00: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68  get_peer_cert_ch
db10: 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ain(statePtr->ss
db20: 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65  l);.    if (!pee
db30: 72 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20  r && (ssl_certs 
db40: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35  == NULL || sk_X5
db50: 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73  09_num(ssl_certs
db60: 29 20 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75  ) == 0)) {..retu
db70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
db80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72    }..    /* Peer
db90: 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20   name from cert 
dba0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
dbb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
dbc0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
dbd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
dbe0: 28 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29  ("peername", -1)
dbf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
dc00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
dc10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
dc20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
dc30: 28 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61  (SSL_get0_peerna
dc40: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
dc50: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ), -1));..    Tc
dc60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
dc70: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
dc80: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
dc90: 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c  ringObj("sbits",
dca0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
dcb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
dcc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
dcd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
dce0: 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  j(SSL_get_cipher
dcf0: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
dd00: 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20  ssl, NULL)));.. 
dd10: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68     ciphers = (ch
dd20: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68  ar*)SSL_get_ciph
dd30: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  er(statePtr->ssl
dd40: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  );.    if ((ciph
dd50: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
dd60: 28 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c  (strcmp(ciphers,
dd70: 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29   "(NONE)") != 0)
dd80: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
dd90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
dda0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
ddb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
ddc0: 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09  cipher", -1));..
ddd0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
dde0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
ddf0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
de00: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
de10: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74  t_cipher(statePt
de20: 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20  r->ssl), -1));. 
de30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
de40: 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72  ify the X509 cer
de50: 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74  tificate present
de60: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a  ed by the peer *
de70: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
de80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
de90: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
dea0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
deb0: 22 76 65 72 69 66 69 63 61 74 69 6f 6e 22 2c 20  "verification", 
dec0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
ded0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
dee0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
def0: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r,..Tcl_NewStrin
df00: 67 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79  gObj(X509_verify
df10: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
df20: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
df30: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
df40: 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a  r->ssl)), -1));.
df50: 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74  .    /* Report t
df60: 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
df70: 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
df80: 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74   of the negotiat
df90: 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67  ion */.    SSL_g
dfa0: 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
dfb0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
dfc0: 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a   &proto, &len);.
dfd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
dfe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
dff0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e000: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61  _NewStringObj("a
e010: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lpn", -1));.    
e020: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e030: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e040: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
e050: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20  StringObj((char 
e060: 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c  *)proto, (int) l
e070: 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en));.    Tcl_Li
e080: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e090: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e0a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e0b0: 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  Obj("protocol", 
e0c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
e0d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e0e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e0f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e100: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73  Obj(SSL_get_vers
e110: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
e120: 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  l), -1));..    /
e130: 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
e140: 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
e150: 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
e160: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
e170: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
e180: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
e190: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e  wStringObj("sign
e1a0: 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74  atureHashAlgorit
e1b0: 68 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  hm", -1));.    i
e1c0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53  f (objc == 2 ? S
e1d0: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e  SL_get_peer_sign
e1e0: 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
e1f0: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a  tr->ssl, &nid) :
e200: 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75   SSL_get_signatu
e210: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  re_nid(statePtr-
e220: 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09  >ssl, &nid)) {..
e230: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e240: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e250: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
e260: 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69  StringObj(OBJ_ni
e270: 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b  d2ln(nid), -1));
e280: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
e290: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e2a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e2b0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e2c0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29  tringObj("", -1)
e2d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
e2e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e2f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e300: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e310: 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72  ingObj("signatur
e320: 65 5f 74 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20  e_type", -1));. 
e330: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
e340: 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   ? SSL_get_peer_
e350: 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
e360: 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
e370: 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65  , &nid) : SSL_ge
e380: 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  t_signature_type
e390: 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
e3a0: 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63  sl, &nid)) {..Tc
e3b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e3c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
e3d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
e3e0: 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32  ringObj(OBJ_nid2
e3f0: 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20  ln(nid), -1));. 
e400: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
e410: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e420: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e430: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e440: 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b  ingObj("", -1));
e450: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
e460: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e470: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
e480: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e490: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
e4a0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
e4b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
e4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
e500: 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
e510: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
e520: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
e530: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
e540: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
e550: 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
e560: 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
e570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5b0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
e5c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
e5d0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
e5e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
e5f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e600: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
e610: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
e620: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
e630: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
e640: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
e650: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
e660: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
e670: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
e680: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
e690: 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ket */.    Tcl_O
e6a0: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20  bj *objPtr;.    
e6b0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a  const SSL *ssl;.
e6c0: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49      const SSL_CI
e6d0: 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20  PHER *cipher;.  
e6e0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53    const SSL_SESS
e6f0: 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20  ION *session;.  
e700: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
e710: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
e720: 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20    long mode;..  
e730: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
e740: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
e750: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
e760: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
e770: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
e780: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
e790: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
e7a0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
e7b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e7c0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
e7d0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
e7e0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
e7f0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
e800: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
e810: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
e820: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
e830: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
e840: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
e850: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
e860: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
e870: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
e880: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
e890: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
e8a0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
e8b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e8c0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
e8d0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
e8e0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
e8f0: 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20  an), "\": not a 
e900: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
e910: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  LL);..return(TCL
e920: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
e930: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
e940: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
e950: 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  ULL);..    /* Co
e960: 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f  nnection info */
e970: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
e980: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
e990: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
e9a0: 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73  ata(chan);.    s
e9b0: 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73  sl = statePtr->s
e9c0: 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  sl;.    if (ssl 
e9d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63  != NULL) {../* c
e9e0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20  onnection state 
e9f0: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
ea00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
ea10: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
ea20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
ea30: 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  tate", -1));..Tc
ea40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ea50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
ea60: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ea70: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74  ringObj(SSL_stat
ea80: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
ea90: 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47  l), -1));.../* G
eaa0: 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64  et SNI requested
eab0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
eac0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
ead0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
eae0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
eaf0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76  wStringObj("serv
eb00: 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09  ername", -1));..
eb10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
eb20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
eb30: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
eb40: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
eb50: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
eb60: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
eb70: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31  E_host_name), -1
eb80: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f  ));.../* Get pro
eb90: 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69  tocol */..Tcl_Li
eba0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ebb0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ebc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ebd0: 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  Obj("protocol", 
ebe0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
ebf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ec00: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ec10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ec20: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e  (SSL_get_version
ec30: 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f  (ssl), -1));.../
ec40: 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20  * Renegotiation 
ec50: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f  allowed */..Tcl_
ec60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ec70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ec80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
ec90: 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61  ngObj("renegotia
eca0: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  tion", -1));..Tc
ecb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ecc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
ecd0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ece0: 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20 20 53 53  ringObj(..    SS
ecf0: 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e  L_get_secure_ren
ed00: 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f  egotiation_suppo
ed10: 72 74 28 73 73 6c 29 20 3f 20 22 73 75 70 70 6f  rt(ssl) ? "suppo
ed20: 72 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70  rted" : "not sup
ed30: 70 6f 72 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a  ported", -1));..
ed40: 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79  ./* Get security
ed50: 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c   level */..Tcl_L
ed60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ed70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
ed80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
ed90: 67 4f 62 6a 28 22 73 65 63 75 72 69 74 79 6c 65  gObj("securityle
eda0: 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  vel", -1));..Tcl
edb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
edc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
edd0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
ede0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75  Obj(SSL_get_secu
edf0: 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29  rity_level(ssl))
ee00: 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
ee10: 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  info */..Tcl_Lis
ee20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ee30: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
ee40: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ee50: 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73  bj("session_reus
ee60: 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ed", -1));..Tcl_
ee70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ee80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ee90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  Ptr, Tcl_NewBool
eea0: 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69  eanObj(SSL_sessi
eeb0: 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 29  on_reused(ssl)))
eec0: 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
eed0: 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69   info */..Tcl_Li
eee0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
eef0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ef00: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ef10: 4f 62 6a 28 22 69 73 5f 73 65 72 76 65 72 22 2c  Obj("is_server",
ef20: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
ef30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
ef40: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
ef50: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
ef60: 62 6a 28 53 53 4c 5f 69 73 5f 73 65 72 76 65 72  bj(SSL_is_server
ef70: 28 73 73 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a  (ssl)));.    }..
ef80: 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e      /* Cipher in
ef90: 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72  fo */.    cipher
efa0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
efb0: 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a  nt_cipher(ssl);.
efc0: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21      if (cipher !
efd0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
efe0: 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30  buf[BUFSIZ] = {0
eff0: 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c  };..int bits, al
f000: 67 5f 62 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69  g_bits;...Tcl_Li
f010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f020: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
f030: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f040: 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31  Obj("cipher", -1
f050: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f060: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f070: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f080: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
f090: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
f0a0: 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29  me(cipher), -1))
f0b0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
f0c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f0d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f0e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74  NewStringObj("st
f0f0: 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31  andard_name", -1
f100: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f110: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f120: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f130: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
f140: 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
f150: 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  rd_name(cipher),
f160: 20 2d 31 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20   -1));...bits = 
f170: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62  SSL_CIPHER_get_b
f180: 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67  its(cipher, &alg
f190: 5f 62 69 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73  _bits);..Tcl_Lis
f1a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f1b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
f1c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f1d0: 62 6a 28 22 62 69 74 73 22 2c 20 2d 31 29 29 3b  bj("bits", -1));
f1e0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f1f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f200: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f210: 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b  ewIntObj(bits));
f220: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f230: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f240: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f250: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63  ewStringObj("sec
f260: 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b  ret_bits", -1));
f270: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f280: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f290: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f2a0: 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74  ewIntObj(alg_bit
f2b0: 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74  s));../* alg_bit
f2c0: 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20  s is actual key 
f2d0: 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20  secret bits. If 
f2e0: 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63  use bits and sec
f2f0: 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20  ret (algorithm) 
f300: 62 69 74 73 20 64 69 66 66 65 72 2c 0a 20 20 20  bits differ,.   
f310: 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 74          the rest
f320: 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65   of the bits are
f330: 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72   fixed, i.e. for
f340: 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20   limited export 
f350: 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20  ciphers (bits < 
f360: 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  56) */..Tcl_List
f370: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f380: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f3a0: 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c  j("min_version",
f3b0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
f3c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f3d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f3e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f3f0: 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  j(SSL_CIPHER_get
f400: 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29  _version(cipher)
f410: 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  , -1));.../* Get
f420: 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
f430: 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
f440: 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  D */..Tcl_ListOb
f450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f460: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f470: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f480: 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  "id", -1));..Tcl
f490: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f4a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
f4b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
f4c0: 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49  Obj((int) SSL_CI
f4d0: 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
f4e0: 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c  er)));...if (SSL
f4f0: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
f500: 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
f510: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
f520: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
f530: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f540: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f550: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f560: 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70  ringObj("descrip
f570: 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20  tion", -1));..  
f580: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f590: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f5a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f5b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c  ewStringObj(buf,
f5c0: 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a   -1));..}.    }.
f5d0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
f5e0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73  info */.    sess
f5f0: 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ion = SSL_get_se
f600: 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20  ssion(ssl);.    
f610: 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e  if (session != N
f620: 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
f630: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
f640: 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  ket;..size_t len
f650: 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  2;..unsigned int
f660: 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e   ulen;..const un
f670: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
f680: 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62  sion_id;..char b
f690: 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
f6a0: 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
f6b0: 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
f6c0: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
f6d0: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
f6e0: 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
f6f0: 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
f700: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
f710: 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
f720: 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
f730: 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  2);..Tcl_ListObj
f740: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f750: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f760: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f770: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  alpn", -1));..Tc
f780: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f790: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f7a0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f7b0: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
f7c0: 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e  proto, (int) len
f7d0: 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 73 75 6d 61  2));.../* Resuma
f7e0: 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09  ble session */..
f7f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f800: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f810: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f820: 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d  StringObj("resum
f830: 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  able", -1));..Tc
f840: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f850: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f860: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  bjPtr, Tcl_NewIn
f870: 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  tObj(SSL_SESSION
f880: 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65  _is_resumable(se
f890: 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53  ssion)));.../* S
f8a0: 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
f8b0: 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
f8c0: 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f   epoch) */..Tcl_
f8d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f8e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
f8f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
f900: 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d  ngObj("start_tim
f910: 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
f920: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f930: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
f940: 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f  tr, Tcl_NewLongO
f950: 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  bj(SSL_SESSION_g
f960: 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29  et_time(session)
f970: 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74  ));.../* Timeout
f980: 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58   value - SSL_CTX
f990: 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e  _get_timeout (in
f9a0: 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63   seconds) */..Tc
f9b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f9c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f9d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f9e0: 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74  ringObj("timeout
f9f0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
fa00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fa10: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fa20: 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  r, Tcl_NewLongOb
fa30: 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  j(SSL_SESSION_ge
fa40: 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f  t_timeout(sessio
fa50: 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  n)));.../* Sessi
fa60: 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69  on ticket lifeti
fa70: 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f  me hint (in seco
fa80: 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  nds) */..Tcl_Lis
fa90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
faa0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fab0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fac0: 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d  bj("lifetime", -
fad0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
fae0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
faf0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
fb00: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53  cl_NewLongObj(SS
fb10: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
fb20: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
fb30: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  nt(session)));..
fb40: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a  ./* Session id *
fb50: 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
fb60: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
fb70: 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
fb80: 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  n);..Tcl_ListObj
fb90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fba0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
fbb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
fbc0: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29  session_id", -1)
fbd0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
fbe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fbf0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fc00: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
fc10: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e  (session_id, (in
fc20: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20  t) ulen));.../* 
fc30: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d  Session ticket -
fc40: 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a   client only */.
fc50: 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
fc60: 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e  0_ticket(session
fc70: 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
fc80: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
fc90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fca0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fcb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
fcc0: 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20  ession_ticket", 
fcd0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
fce0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fcf0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fd00: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
fd10: 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74  Obj(ticket, (int
fd20: 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54  ) len2));.../* T
fd30: 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
fd40: 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
fd50: 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61  et0_ticket_appda
fd60: 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  ta(session, &tic
fd70: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63  ket, &len2);..Tc
fd80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fd90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fda0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fdb0: 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f  ringObj("ticket_
fdc0: 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b  app_data", -1));
fdd0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
fde0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
fdf0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
fe00: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
fe10: 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e  icket, (int) len
fe20: 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61  2));.../* Get ma
fe30: 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e  ster key */..len
fe40: 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  2 = SSL_SESSION_
fe50: 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73  get_master_key(s
fe60: 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20  ession, buffer, 
fe70: 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b  SSL_MAX_MASTER_K
fe80: 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c  EY_LENGTH);..Tcl
fe90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fea0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
feb0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fec0: 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b  ingObj("master_k
fed0: 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ey", -1));..Tcl_
fee0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fef0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ff00: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
ff10: 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c  ArrayObj(buffer,
ff20: 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20   (int) len2));. 
ff30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
ff40: 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
ff50: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
ff60: 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48  NULL) {.#ifdef H
ff70: 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
ff80: 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f  ION..const COMP_
ff90: 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65  METHOD *comp, *e
ffa0: 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c  xpn;..comp = SSL
ffb0: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d  _get_current_com
ffc0: 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  pression(ssl);..
ffd0: 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63  expn = SSL_get_c
ffe0: 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e  urrent_expansion
fff0: 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73  (ssl);...Tcl_Lis
10000 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10010 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10020 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10030 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  bj("compression"
10040 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
10050 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10060 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10070 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10080 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f  bj(comp ? SSL_CO
10090 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70  MP_get_name(comp
100a0 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29  ) : "NONE", -1))
100b0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
100c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
100d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
100e0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78  NewStringObj("ex
100f0 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  pansion", -1));.
10100 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10110 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10120 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10130 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20  wStringObj(expn 
10140 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  ? SSL_COMP_get_n
10150 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e  ame(expn) : "NON
10160 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a  E", -1));.#else.
10170 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10180 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10190 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
101a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70  wStringObj("comp
101b0 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  ression", -1));.
101c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
101d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
101e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
101f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45  wStringObj("NONE
10200 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
10210 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10220 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10230 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10240 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c  Obj("expansion",
10250 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
10260 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10270 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10280 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10290 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  j("NONE", -1));.
102a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
102b0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f    /* Server info
102c0 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53   */.    mode = S
102d0 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69  SL_CTX_get_sessi
102e0 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
102f0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
10300 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c    if (mode & SSL
10310 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
10320 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66   {..proto = "off
10330 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
10340 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
10350 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20  S_CACHE_CLIENT) 
10360 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65  {..proto = "clie
10370 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  nt";.    } else 
10380 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
10390 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52  ESS_CACHE_SERVER
103a0 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65  ) {..proto = "se
103b0 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73  rver";.    } els
103c0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
103d0 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48  _SESS_CACHE_BOTH
103e0 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f  ) {..proto = "bo
103f0 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  th";.    } else 
10400 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e  {..proto = "unkn
10410 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  own";.    }.    
10420 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10430 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10440 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10450 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
10460 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20  on_cache_mode", 
10470 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
10480 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10490 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
104a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
104b0 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b  Obj(proto, -1));
104c0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
104d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
104e0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
104f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
10500 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
10510 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
10520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10560 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f  -. *. * VersionO
10570 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
10580 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
10590 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
105a0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
105b0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
105c0 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
105d0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
105e0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
10630 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69  static int.Versi
10640 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  onObjCmd(ClientD
10650 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
10660 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10670 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
10680 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
10690 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
106a0 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20  bj *objPtr;..   
106b0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
106c0 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
106d0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
106e0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
106f0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
10700 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10710 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
10720 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
10730 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
10740 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
10750 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a  ;..objc = objc;.
10760 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a  .objv = objv;.}.
10770 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
107c0 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d   MiscObjCmd -- m
107d0 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  isc commands. *.
107e0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
107f0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
10800 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
10810 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
10820 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
10870 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f  static int.MiscO
10880 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10890 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
108a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
108b0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
108c0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
108d0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  ) {.    static c
108e0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61  onst char *comma
108f0 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22  nds [] = { "req"
10900 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c  , "strreq", NULL
10910 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d   };.    enum com
10920 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f  mand { C_REQ, C_
10930 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20  STRREQ, C_DUMMY 
10940 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20  };.    int cmd, 
10950 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20  isStr;.    char 
10960 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a  buffer[16384];..
10970 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
10980 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
10990 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
109a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
109b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
109c0 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
109d0 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
109e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
109f0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
10a00 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
10a10 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
10a20 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
10a30 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f  0,&cmd) != TCL_O
10a40 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
10a50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
10a60 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20     isStr = (cmd 
10a70 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20  == C_STRREQ);.  
10a80 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
10a90 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a  command) cmd) {.
10aa0 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61  .case C_REQ:..ca
10ab0 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09  se C_STRREQ: {..
10ac0 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b      EVP_PKEY *pk
10ad0 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35  ey=NULL;..    X5
10ae0 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09  09 *cert=NULL;..
10af0 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e      X509_NAME *n
10b00 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54  ame=NULL;..    T
10b10 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a  cl_Obj **listv;.
10b20 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69  .    int listc,i
10b30 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74  ;...    BIO *out
10b40 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61  =NULL;...    cha
10b50 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d  r *k_C="",*k_ST=
10b60 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d  "",*k_L="",*k_O=
10b70 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43  "",*k_OU="",*k_C
10b80 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22  N="",*k_Email=""
10b90 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79  ;..    char *key
10ba0 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72  out,*pemout,*str
10bb0 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69  ;..    int keysi
10bc0 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73  ze,serial=0,days
10bd0 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  =365;..#if OPENS
10be0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
10bf0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
10c00 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65  .    BIGNUM *bne
10c10 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53   = NULL;..    RS
10c20 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23  A *rsa = NULL;.#
10c30 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b  else..    EVP_PK
10c40 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  EY_CTX *ctx = NU
10c50 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20  LL;.#endif...   
10c60 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c   if ((objc<5) ||
10c70 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54   (objc>6)) {...T
10c80 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10c90 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10ca0 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c   "keysize keyfil
10cb0 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f  e certfile ?info
10cc0 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  ?");...return TC
10cd0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
10ce0 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ..    if (Tcl_Ge
10cf0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
10d00 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65  rp, objv[2], &ke
10d10 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  ysize) != TCL_OK
10d20 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ) {...return TCL
10d30 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
10d40 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47      keyout=Tcl_G
10d50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
10d60 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54  );..    pemout=T
10d70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10d80 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28  v[4]);..    if (
10d90 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53  isStr) {...Tcl_S
10da0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79  etVar(interp,key
10db0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c  out,"",0);...Tcl
10dc0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70  _SetVar(interp,p
10dd0 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20  emout,"",0);..  
10de0 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62    }...    if (ob
10df0 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54  jc>=6) {...if (T
10e00 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
10e10 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62  ments(interp, ob
10e20 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63  jv[5],....&listc
10e30 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c  , &listv) != TCL
10e40 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74  _OK) {...    ret
10e50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
10e60 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63  .}....if ((listc
10e70 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20  %2) != 0) {...  
10e80 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
10e90 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74  interp,"Informat
10ea0 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61  ion list must ha
10eb0 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f  ve even number o
10ec0 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c  f arguments",NUL
10ed0 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  L);...    return
10ee0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
10ef0 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69  ..for (i=0; i<li
10f00 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20  stc; i+=2) {... 
10f10 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74     str=Tcl_GetSt
10f20 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a  ring(listv[i]);.
10f30 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70  ..    if (strcmp
10f40 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29  (str,"days")==0)
10f50 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
10f60 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
10f70 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64  rp,listv[i+1],&d
10f80 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ays)!=TCL_OK)...
10f90 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10fa0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
10fb0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
10fc0 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29  tr,"serial")==0)
10fd0 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
10fe0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
10ff0 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73  rp,listv[i+1],&s
11000 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a  erial)!=TCL_OK).
11010 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
11020 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
11030 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
11040 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a  (str,"C")==0) {.
11050 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74  ...k_C=Tcl_GetSt
11060 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
11070 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
11080 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53  f (strcmp(str,"S
11090 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53  T")==0) {....k_S
110a0 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  T=Tcl_GetString(
110b0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
110c0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
110d0 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30  rcmp(str,"L")==0
110e0 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47  ) {....k_L=Tcl_G
110f0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
11100 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
11110 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
11120 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"O")==0) {....
11130 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_O=Tcl_GetStrin
11140 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
11150 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
11160 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29  strcmp(str,"OU")
11170 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54  ==0) {....k_OU=T
11180 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
11190 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
111a0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
111b0 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20  p(str,"CN")==0) 
111c0 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65  {....k_CN=Tcl_Ge
111d0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
111e0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
111f0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
11200 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a  ,"Email")==0) {.
11210 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47  ...k_Email=Tcl_G
11220 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
11230 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
11240 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52  se {....Tcl_SetR
11250 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e  esult(interp,"Un
11260 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22  known parameter"
11270 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72  ,NULL);....retur
11280 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
11290 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a     }...}..    }.
112a0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
112b0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
112c0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62  30000000L..    b
112d0 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09  ne = BN_new();..
112e0 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65      rsa = RSA_ne
112f0 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d  w();..    pkey =
11300 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b   EVP_PKEY_new();
11310 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d  ..    if (bne ==
11320 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20   NULL || rsa == 
11330 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20  NULL || pkey == 
11340 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f  NULL || !BN_set_
11350 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29  word(bne,RSA_F4)
11360 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72   ||...!RSA_gener
11370 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20  ate_key_ex(rsa, 
11380 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55  keysize, bne, NU
11390 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  LL) || !EVP_PKEY
113a0 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79  _assign_RSA(pkey
113b0 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f  , rsa)) {...EVP_
113c0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
113d0 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72  .../* RSA_free(r
113e0 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56  sa); freed by EV
113f0 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09  P_PKEY_free */..
11400 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
11410 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d  else..    pkey =
11420 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e   EVP_RSA_gen((un
11430 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73  signed int) keys
11440 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d  ize);..    ctx =
11450 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
11460 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20  w(pkey,NULL);.. 
11470 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e     if (pkey == N
11480 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55  ULL || ctx == NU
11490 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  LL || !EVP_PKEY_
114a0 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29  keygen_init(ctx)
114b0 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f   ||...!EVP_PKEY_
114c0 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67  CTX_set_rsa_keyg
114d0 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79  en_bits(ctx, key
114e0 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b  size) || !EVP_PK
114f0 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26  EY_keygen(ctx, &
11500 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50  pkey)) {...EVP_P
11510 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
11520 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66  ..EVP_PKEY_CTX_f
11530 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66  ree(ctx);.#endif
11540 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
11550 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
11560 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
11570 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
11580 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11590 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
115a0 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
115b0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
115c0 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
115d0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
115e0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
115f0 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
11600 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
11610 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
11620 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
11630 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
11640 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
11650 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
11660 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
11670 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
11680 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72  rp,keyout,buffer
11690 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
116a0 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
116b0 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
116c0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
116d0 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
116e0 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
116f0 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
11700 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
11710 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
11720 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
11730 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
11740 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
11750 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77  ;...    /* PEM_w
11760 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76  rite_bio_RSAPriv
11770 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c  ateKey(out, rsa,
11780 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20   NULL, NULL, 0, 
11790 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a  NULL, NULL); */.
117a0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
117b0 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09  ll(out);.. .}...
117c0 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f  .if ((cert=X509_
117d0 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a  new())==NULL) {.
117e0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
117f0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
11800 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72  r generating cer
11810 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74  tificate request
11820 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45  ",NULL);...    E
11830 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
11840 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
11850 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
11860 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
11870 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
11880 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65  .#endif...    re
11890 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
118a0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74  ...}....X509_set
118b0 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29  _version(cert,2)
118c0 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52  ;...ASN1_INTEGER
118d0 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65  _set(X509_get_se
118e0 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
118f0 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39  ,serial);...X509
11900 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
11910 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28  _getm_notBefore(
11920 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
11930 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
11940 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63  _getm_notAfter(c
11950 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30  ert),(long)60*60
11960 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30  *24*days);...X50
11970 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72  9_set_pubkey(cer
11980 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65  t,pkey);....name
11990 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63  =X509_get_subjec
119a0 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09  t_name(cert);...
119b0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
119c0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
119d0 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"C", MBSTRING_A
119e0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
119f0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
11a00 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
11a10 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
11a20 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
11a30 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
11a40 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
11a50 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c  ed char *) k_ST,
11a60 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
11a70 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
11a80 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
11a90 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  L", MBSTRING_ASC
11aa0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
11ab0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
11ac0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
11ad0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
11ae0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
11af0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
11b00 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
11b10 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c  char *) k_O, -1,
11b20 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
11b30 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
11b40 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c  y_txt(name,"OU",
11b50 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
11b60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11b70 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c  har *) k_OU, -1,
11b80 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
11b90 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
11ba0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c  y_txt(name,"CN",
11bb0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
11bc0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11bd0 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
11be0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
11bf0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
11c00 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
11c10 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
11c20 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
11c30 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69  d char *) k_Emai
11c40 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a  l, -1, -1, 0);..
11c50 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65  ..X509_set_subje
11c60 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d  ct_name(cert,nam
11c70 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39  e);....if (!X509
11c80 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c  _sign(cert,pkey,
11c90 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b  EVP_sha256())) {
11ca0 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  ...    X509_free
11cb0 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56  (cert);...    EV
11cc0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
11cd0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
11ce0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
11cf0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
11d00 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
11d10 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
11d20 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
11d30 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
11d40 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
11d50 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
11d60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
11d70 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
11d80 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
11d90 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
11da0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
11db0 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
11dc0 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
11dd0 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
11de0 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
11df0 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
11e00 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
11e10 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
11e20 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
11e30 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
11e40 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
11e50 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
11e60 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
11e70 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
11e80 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
11e90 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
11ea0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
11eb0 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
11ec0 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
11ed0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
11ee0 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
11ef0 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
11f00 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
11f10 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
11f20 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
11f30 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
11f40 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
11f50 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42   0x30000000L...B
11f60 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
11f70 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  dif..    }..}..b
11f80 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
11f90 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
11fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11fb0 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
11fc0 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
11fd0 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11fe0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74  *******/./* Init
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
12000 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12010 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
12020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12060 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20  . *. * Tls_Free 
12070 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
12080 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
12090 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
120a0 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
120b0 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
120c0 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
120d0 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
120e0 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ow 1. *. * Resul
120f0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
12100 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
12110 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65   *.Frees all the
12120 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d   state. *. *----
12130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12170 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65   */.void.Tls_Fre
12180 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72  e(char *blockPtr
12190 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
121a0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
121b0 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20   *)blockPtr;..  
121c0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
121d0 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c  d");..    Tls_Cl
121e0 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ean(statePtr);. 
121f0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50     ckfree(blockP
12200 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
12210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12250 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61  -. *. * Tls_Clea
12260 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
12270 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
12280 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
12290 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
122a0 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
122b0 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
122c0 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
122d0 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68  elow 1.  This sh
122e0 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65  ould. *.be calle
122f0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20  d synchronously 
12300 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63  by the CloseProc
12310 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09  , not in the. *.
12320 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63  EventuallyFree c
12330 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
12340 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
12350 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
12360 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
12370 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
12380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123c0 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  ---. */.void Tls
123d0 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74  _Clean(State *st
123e0 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70  atePtr) {.    dp
123f0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
12400 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
12410 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68  we're assuming h
12420 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73  ere that we're s
12430 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20  ingle-threaded. 
12440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73      */.    if (s
12450 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
12460 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
12470 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
12480 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
12490 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
124a0 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
124b0 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  timer = NULL;.  
124c0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
124d0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b  tePtr->protos) {
124e0 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74  ..ckfree(statePt
124f0 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61  r->protos);..sta
12500 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
12510 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
12520 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69  if (statePtr->bi
12530 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69  o) {../* This wi
12540 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74  ll call SSL_shut
12550 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34  down. Bug 141404
12560 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42  5 */..dprintf("B
12570 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22  IO_free_all(%p)"
12580 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  , statePtr->bio)
12590 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  ;..BIO_free_all(
125a0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
125b0 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d  .statePtr->bio =
125c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
125d0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
125e0 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  sl) {..dprintf("
125f0 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73  SSL_free(%p)", s
12600 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
12610 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74  SSL_free(statePt
12620 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50  r->ssl);..stateP
12630 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  tr->ssl = NULL;.
12640 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
12650 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09  atePtr->ctx) {..
12660 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61  SSL_CTX_free(sta
12670 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74  tePtr->ctx);..st
12680 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55  atePtr->ctx = NU
12690 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
126a0 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
126b0 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63  back) {..Tcl_Dec
126c0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
126d0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
126e0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
126f0 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ck = NULL;.    }
12700 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
12710 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  r->password) {..
12720 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
12730 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
12740 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ord);..statePtr-
12750 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c  >password = NULL
12760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
12770 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
12780 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
127d0 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
127e0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
127f0 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
12800 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
12810 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
12820 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
12830 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
12840 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
12850 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
12860 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
12870 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
12880 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
12890 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
128a0 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
128b0 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
128c0 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
128d0 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
12920 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
12930 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
12940 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
12950 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
12960 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
12970 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
12980 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
12990 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
129a0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
129b0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f    /*.     * We o
129c0 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20  nly support Tcl 
129d0 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20  8.4 or newer.   
129e0 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69    */.    if (.#i
129f0 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
12a00 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62  BS..Tcl_InitStub
12a10 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c  s(interp, "8.4",
12a20 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50   0).#else..Tcl_P
12a30 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70  kgRequire(interp
12a40 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c  , "Tcl", "8.4-",
12a50 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20   0).#endif.. == 
12a60 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
12a70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12a80 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62  ..    if (TlsLib
12a90 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f  Init(0) != TCL_O
12aa0 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  K) {..Tcl_Append
12ab0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12ac0 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61  could not initia
12ad0 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79  lize SSL library
12ae0 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
12af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12b00 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   }..    Tcl_Crea
12b10 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
12b20 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65  erp, "tls::ciphe
12b30 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
12b40 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
12b50 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
12b60 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
12b70 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
12b80 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
12b90 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69  , "tls::connecti
12ba0 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  on", ConnectionI
12bb0 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  nfoObjCmd, (Clie
12bc0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
12bd0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
12be0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
12bf0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
12c00 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68  (interp, "tls::h
12c10 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73  andshake", Hands
12c20 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  hakeObjCmd, (Cli
12c30 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
12c40 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
12c50 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
12c60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
12c70 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
12c80 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f  import", ImportO
12c90 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
12ca0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
12cb0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
12cc0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
12cd0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
12ce0 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70  erp, "tls::unimp
12cf0 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
12d00 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
12d10 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
12d20 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
12d30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
12d40 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
12d50 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73  rp, "tls::status
12d60 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c  ", StatusObjCmd,
12d70 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
12d80 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
12d90 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
12da0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
12db0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
12dc0 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
12dd0 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
12de0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
12df0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
12e00 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
12e10 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
12e20 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
12e30 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a  ::misc", MiscObj
12e40 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
12e50 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
12e60 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
12e70 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
12e80 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
12e90 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  p, "tls::protoco
12ea0 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  ls", ProtocolsOb
12eb0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
12ec0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
12ed0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
12ee0 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
12ef0 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28  rp) {..Tcl_Eval(
12f00 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e  interp, tlsTclIn
12f10 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  itScript);.    }
12f20 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c  ..    return(Tcl
12f30 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
12f40 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41  rp, "tls", PACKA
12f50 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a  GE_VERSION));.}.
12f60 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
12fa0 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
12fb0 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53  ----------*. *.S
12ff0 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72  tandard procedur
13000 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c  e required by 'l
13010 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c  oad'.. *.Initial
13020 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73  izes this extens
13030 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69  ion for a safe i
13040 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d  nterpreter.. *.-
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
13080 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
13090 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27  cts:. *..As of '
130a0 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09  Tls_Init'. *. *.
130b0 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74  Result:. *..A st
130c0 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72  andard Tcl error
130d0 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   code.. *. *----
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13110 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52  --*. */.DLLEXPOR
13120 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e  T int Tls_SafeIn
13130 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
13140 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72  nterp) {.    dpr
13150 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
13160 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49      return(Tls_I
13170 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a  nit(interp));.}.
13180 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
131c0 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d  . *.TlsLibInit -
131d0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13200 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69  --------*. *.Ini
13210 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
13220 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70  rary once per ap
13230 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d  plication. *.---
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
13270 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
13280 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a  s:. *..initializ
13290 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20  es SSL library. 
132a0 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
132b0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  -*. */.static in
13300 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74  t TlsLibInit(int
13310 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b   uninitialize) {
13320 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
13330 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
13340 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20  .    int status 
13350 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65  = TCL_OK;.#if de
13360 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
13370 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
13380 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
13390 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f     size_t num_lo
133a0 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  cks;.#endif..   
133b0 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a   if (uninitializ
133c0 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  e) {.        if 
133d0 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
133e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 70 72  .            dpr
133f0 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
13400 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74  ninitialize, but
13410 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74   we are not init
13420 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20  ialized");..    
13430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54          return(T
13440 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  CL_OK);.        
13450 7d 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e  }..        dprin
13460 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
13470 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69  nitialize");..#i
13480 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
13490 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
134a0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
134b0 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d  S).        Tcl_M
134c0 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
134d0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20  x);..        if 
134e0 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20  (locks) {.      
134f0 20 20 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73        free(locks
13500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
13510 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ocks = NULL;.   
13520 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f           locksCo
13530 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unt = 0;.       
13540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13550 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20    initialized = 
13560 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
13570 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
13580 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
13590 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 20 20  THREADS).       
135a0 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b   Tcl_MutexUnlock
135b0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
135c0 69 66 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75  if..        retu
135d0 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20  rn(TCL_OK);.    
135e0 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69  }..    if (initi
135f0 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20  alized) {.      
13600 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
13610 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63  d, but using cac
13620 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20  hed value");.   
13630 20 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74       return(stat
13640 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  us);.    }..    
13650 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
13660 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
13670 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
13680 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
13690 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c  THREADS).    Tcl
136a0 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
136b0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  _mx);.#endif.   
136c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31   initialized = 1
136d0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
136e0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
136f0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
13700 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f  HREADS).    num_
13710 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c  locks = 1;.    l
13720 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74  ocksCount = (int
13730 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20  ) num_locks;.   
13740 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28   locks = malloc(
13750 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
13760 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20   num_locks);.   
13770 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30   memset(locks, 0
13780 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  , sizeof(*locks)
13790 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23   * num_locks);.#
137a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e  endif..    /* In
137b0 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69  itialize BOTH li
137c0 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73  bcrypto and libs
137d0 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53  sl. */.    OPENS
137e0 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e  SL_init_ssl(OPEN
137f0 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53  SSL_INIT_LOAD_SS
13800 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e  L_STRINGS | OPEN
13810 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52  SSL_INIT_LOAD_CR
13820 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20  YPTO_STRINGS..| 
13830 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
13840 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f  _ALL_CIPHERS | O
13850 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
13860 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c  ALL_DIGESTS, NUL
13870 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77  L);..    BIO_new
13880 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  _tcl(NULL, 0);..
13890 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20  #if 0.    /*.   
138a0 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65    * XXX:TODO: Re
138b0 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61  move this code a
138c0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  nd replace it wi
138d0 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20  th a check.     
138e0 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74  * for enough ent
138f0 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20  ropy and do not 
13900 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75  try to create ou
13910 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72  r own.     * ter
13920 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20  rible entropy.  
13930 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20     */.    /*.   
13940 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e    * Seed the ran
13950 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
13960 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  ator in the SSL 
13970 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20  library,.     * 
13980 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69  using the do/whi
13990 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63  le construct bec
139a0 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20  ause of the bug 
139b0 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  note in the.    
139c0 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61   * OpenSSL FAQ a
139d0 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65  t http://www.ope
139e0 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74  nssl.org/support
139f0 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a  /faq.html#USER1.
13a00 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
13a10 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72  e crux of the pr
13a20 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f  oblem is that So
13a30 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74  laris 7 does not
13a40 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f   have a.     * /
13a50 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64  dev/random or /d
13a60 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63  ev/urandom devic
13a70 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67  e so it cannot g
13a80 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20  ather enough.   
13a90 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d    * entropy from
13aa0 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29   the RAND_seed()
13ab0 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61   when TLS initia
13ac0 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65  lizes and refuse
13ad0 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66  s.     * to go f
13ae0 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20  urther. Earlier 
13af0 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e  versions of Open
13b00 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72  SSL carried on r
13b10 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
13b20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e  */.    srand((un
13b30 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65  signed int) time
13b40 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c  ((time_t *) NULL
13b50 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f  ));.    do {..fo
13b60 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36  r (i = 0; i < 16
13b70 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e  ; i++) {..    rn
13b80 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20  d_seed[i] = 1 + 
13b90 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20  (char) (255.0 * 
13ba0 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58  rand()/(RAND_MAX
13bb0 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44  +1.0));..}..RAND
13bc0 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20  _seed(rnd_seed, 
13bd0 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29  sizeof(rnd_seed)
13be0 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  );.    } while (
13bf0 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d  RAND_status() !=
13c00 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   1);.#endif..#if
13c10 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
13c20 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
13c30 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
13c40 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
13c50 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
13c60 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74  ndif...return(st
13c70 61 74 75 73 29 3b 0a 7d 0a                       atus);.}.