Hex Artifact Content

Artifact 54886bd8436b6aea897c87bc7023804d8952f24090c532cfdef5c9f04d6939ba:


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 54 68 72 65 61 64 2d 53 61 66  /*. * Thread-Saf
0780: 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a  e TLS Code. */..
0790: 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41  #ifdef TCL_THREA
07a0: 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53  DS.#define OPENS
07b0: 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45  SL_THREAD_DEFINE
07c0: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
07d0: 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e  ssl/opensslconf.
07e0: 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53  h>..#ifdef OPENS
07f0: 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c  SL_THREADS.#incl
0800: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79  ude <openssl/cry
0810: 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pto.h>.#include 
0820: 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a  <openssl/ssl.h>.
0830: 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20  ./*. * Threaded 
0840: 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72  operation requir
0850: 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62  es locking callb
0860: 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72  acks. * Based fr
0870: 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74  om /crypto/crypt
0880: 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c  lib.c of OpenSSL
0890: 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a   and NSOpenSSL..
08a0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f   */..static Tcl_
08b0: 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e  Mutex *locks = N
08c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ULL;.static int 
08d0: 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
08e0: 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78  static Tcl_Mutex
08f0: 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66   init_mx;.#endif
0900: 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45   /* OPENSSL_THRE
0910: 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  ADS */.#endif /*
0920: 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a   TCL_THREADS */.
0930: 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
0940: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c  ********/./* Cal
0950: 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f  lbacks        */
0960: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0970: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c  -. *. * Eval Cal
09d0: 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d  lback Command --
09e0: 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c  . *. *.Eval call
09f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  back command and
0a00: 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72   catch any error
0a10: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
0a20: 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20  . *.0 = Command 
0a30: 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72  returned fail or
0a40: 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54   eval returned T
0a50: 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20  CL_ERROR. *.1 = 
0a60: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64  Command returned
0a70: 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c   success or eval
0a80: 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b   returned TCL_OK
0a90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
0aa0: 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65  cts:. *.Evaluate
0ab0: 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  s callback comma
0ac0: 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  nd. *. *--------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0b10: 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43  static int.EvalC
0b20: 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65  allback(Tcl_Inte
0b30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74  rp *interp, Stat
0b40: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c  e *statePtr, Tcl
0b50: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a  _Obj *cmdPtr) {.
0b60: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b      int code, ok
0b70: 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c 5f 50   = 0;..    Tcl_P
0b80: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
0b90: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
0ba0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0bb0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
0bc0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  ePtr);..    /* E
0bd0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  val callback wit
0be0: 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b  h success for ok
0bf0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65   or return value
0c00: 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72   1, fail for err
0c10: 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  or or return val
0c20: 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ue 0 */.    Tcl_
0c30: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
0c40: 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  rp);.    code = 
0c50: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
0c60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
0c70: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
0c80: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
0c90: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68  TCL_OK) {../* Ch
0ca0: 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72  eck result for r
0cb0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
0cc0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20  Tcl_Obj *result 
0cd0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
0ce0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20  lt(interp);..if 
0cf0: 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20  (result == NULL 
0d00: 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  || Tcl_GetIntFro
0d10: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73  mObj(interp, res
0d20: 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c  ult, &ok) != TCL
0d30: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d  _OK) {..    ok =
0d40: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73   1;..}.    } els
0d50: 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20  e {../* Error - 
0d60: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69  reject the certi
0d70: 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20 28 54  ficate */.#if (T
0d80: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
0d90: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
0da0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
0db0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
0dc0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
0dd0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
0de0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
0df0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
0e00: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
0e10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
0e20: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
0e30: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
0e40: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
0e50: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65   interp);.    re
0e60: 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a  turn ok;.}.../*.
0e70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f  -----. *. * Info
0ec0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
0ed0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63  *.Monitors SSL c
0ee0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73  onnection proces
0ef0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
0f00: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
0f10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0f20: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
0f30: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
0f40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0f90: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63  void.InfoCallbac
0fa0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
0fb0: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
0fc0: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74   ret) {.    Stat
0fd0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
0fe0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
0ff0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
1000: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
1010: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1020: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1030: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1040: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61  tr;.    char *ma
1050: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72  jor; char *minor
1060: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
1070: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
1080: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
1090: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
10a0: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
10b0: 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65  ;..    if (where
10c0: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
10d0: 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61  AKE_START) {..ma
10e0: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
10f0: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61  ";..minor = "sta
1100: 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rt";.    } else 
1110: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1120: 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e  CB_HANDSHAKE_DON
1130: 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  E) {..major = "h
1140: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
1150: 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20  r = "done";.    
1160: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68  } else {..if (wh
1170: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45  ere & SSL_CB_ALE
1180: 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c  RT)..major = "al
1190: 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ert";..else if (
11a0: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43  where & SSL_ST_C
11b0: 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20  ONNECT).major = 
11c0: 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65  "connect";..else
11d0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
11e0: 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a  _ST_ACCEPT)..maj
11f0: 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09  or = "accept";..
1200: 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d  else.....major =
1210: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66   "unknown";...if
1220: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1230: 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20  _READ)..minor = 
1240: 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66  "read";..else if
1250: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1260: 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d  _WRITE)..minor =
1270: 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20   "write";..else 
1280: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1290: 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20  CB_LOOP)..minor 
12a0: 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20  = "loop";..else 
12b0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
12c0: 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20  CB_EXIT)..minor 
12d0: 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09  = "exit";..else.
12e0: 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b  ....minor = "unk
12f0: 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20  nown";.    }..  
1300: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
1310: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
1320: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
1330: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
1340: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1390: 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  "info", -1));.  
13a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
13c0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
13d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13e0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
13f0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
1400: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
1410: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1420: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1430: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1440: 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20  tringObj(major, 
1450: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1470: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1480: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1490: 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b  Obj(minor, -1));
14a0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
14b0: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20  & SSL_CB_ALERT) 
14c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
14d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14e0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
14f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1500: 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63  j(SSL_alert_desc
1510: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74  _string_long(ret
1520: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
1530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1560: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1570: 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c  rt_type_string_l
1580: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1590: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
15a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
15b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
15c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
15d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
15e0: 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f  _state_string_lo
15f0: 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09  ng(ssl), -1));..
1600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1620: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1630: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22  StringObj("info"
1640: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  , -1));.    }.. 
1650: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
1660: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
1670: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1680: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
1690: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
16a0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
16b0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
16c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
16d0: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  dPtr);.}.../*. *
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67  ---. *. * Messag
1730: 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  eCallback --. *.
1740: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
1750: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65  protocol message
1760: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
1770: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
1780: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1790: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
17a0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
17b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ----. */.#ifndef
1800: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f   OPENSSL_NO_SSL_
1810: 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69  TRACE.static voi
1820: 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  d.MessageCallbac
1830: 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69  k(int write_p, i
1840: 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20  nt version, int 
1850: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f  content_type, co
1860: 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73  nst void *buf, s
1870: 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a  ize_t len, SSL *
1880: 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ssl, void *arg) 
1890: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
18a0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
18b0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
18c0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
18d0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
18e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
18f0: 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76  Ptr;.    char *v
1900: 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42  er, *type;.    B
1910: 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61  IO *bio;.    cha
1920: 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b  r buffer[15000];
1930: 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d  .    buffer[0] =
1940: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
1950: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
1960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
1970: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
1980: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
1990: 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28  rn;..    switch(
19a0: 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f  version) {.#if O
19b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
19c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
19d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
19e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
19f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1a00: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53  SSL2).    case S
1a10: 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL2_VERSION:..ve
1a20: 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72  r = "SSLv2";..br
1a30: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
1a40: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
1a50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
1a60: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20  ENSSL_NO_SSL3). 
1a70: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52     case SSL3_VER
1a80: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53  SION:..ver = "SS
1a90: 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  Lv3";..break;.#e
1aa0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c  ndif.    case TL
1ab0: 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  S1_VERSION:..ver
1ac0: 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65   = "TLSv1";..bre
1ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1ae0: 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_1_VERSION:..ve
1af0: 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09  r = "TLSv1.1";..
1b00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b10: 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a  TLS1_2_VERSION:.
1b20: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22  .ver = "TLSv1.2"
1b30: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1b40: 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  se TLS1_3_VERSIO
1b50: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b60: 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  .3";..break;.   
1b70: 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20   case 0:..ver = 
1b80: 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a  "none";..break;.
1b90: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65      default:..ve
1ba0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09  r = "unknown";..
1bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1bc0: 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e    switch (conten
1bd0: 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61  t_type) {.    ca
1be0: 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45  se SSL3_RT_HEADE
1bf0: 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64  R:..type = "Head
1c00: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  er";..break;.   
1c10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e   case SSL3_RT_IN
1c20: 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45  NER_CONTENT_TYPE
1c30: 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72  :..type = "Inner
1c40: 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a   Content Type";.
1c50: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1c60: 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f   SSL3_RT_CHANGE_
1c70: 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79  CIPHER_SPEC:..ty
1c80: 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70  pe = "Change Cip
1c90: 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  her";..break;.  
1ca0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41    case SSL3_RT_A
1cb0: 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41  LERT:..type = "A
1cc0: 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  lert";..break;. 
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1ce0: 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65  HANDSHAKE:..type
1cf0: 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a   = "Handshake";.
1d00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d10: 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41   SSL3_RT_APPLICA
1d20: 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65  TION_DATA:..type
1d30: 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09   = "App Data";..
1d40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d50: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1d60: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1d70: 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b  rtbeat";..break;
1d80: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74  .    default:..t
1d90: 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ype = "unknown";
1da0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
1db0: 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d  eeds compile tim
1dc0: 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65  e option "enable
1dd0: 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a  -ssl-trace". */.
1de0: 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42      if ((bio = B
1df0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
1e00: 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ())) != NULL) {.
1e10: 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61  .int n;..SSL_tra
1e20: 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73  ce(write_p, vers
1e30: 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70  ion, content_typ
1e40: 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c  e, buf, len, ssl
1e50: 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a  , (void *)bio);.
1e60: 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69  .n = BIO_read(bi
1e70: 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42  o, buffer, min(B
1e80: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c  IO_pending(bio),
1e90: 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28   14999));..n = (
1ea0: 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62  n<0) ? 0 : n;..b
1eb0: 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28  uffer[n] = 0;..(
1ec0: 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62  void)BIO_flush(b
1ed0: 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62  io);..BIO_free(b
1ee0: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f  io);.   }..    /
1ef0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
1f00: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
1f10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
1f20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
1f30: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1f40: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1f50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1f60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
1f70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
1f80: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
1f90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1fa0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1fb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1fc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1fd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
1fe0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
1ff0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2000: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2010: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2020: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
2030: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
2040: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
2050: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
2060: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2070: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2080: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2090: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
20a0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
20b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
20c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
20d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
20e0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
20f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2100: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2110: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2120: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
2130: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
2140: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
2150: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
2160: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2170: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2180: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2190: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
21a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
21b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
21c0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
21d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2220: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
2230: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
2240: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
2250: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
2260: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2270: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2280: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2290: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
22a0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
22b0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
22c0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
22d0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
22e0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
22f0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
2300: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
2310: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
2320: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
2330: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63  cks:. *.certific
2340: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65  ate chain is che
2350: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  cked starting wi
2360: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e  th the deepest n
2370: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09  esting level. *.
2380: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63    (the root CA c
2390: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20  ertificate) and 
23a0: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f  worked upward to
23b0: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74   the peer's cert
23c0: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20  ificate.. *.All 
23d0: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76  signatures are v
23e0: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69  alid, current ti
23f0: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72  me is within fir
2400: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69  st and last vali
2410: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68  dity time.. *.Ch
2420: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72  eck that the cer
2430: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75  tificate is issu
2440: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72  ed by the issuer
2450: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
2460: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  uer.. *.Check th
2470: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  e revocation sta
2480: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72  tus for each cer
2490: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65  tificate.. *.Che
24a0: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20  ck the validity 
24b0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c  of the given CRL
24c0: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65   and the cert re
24d0: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e  vocation status.
24e0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f  . *.Check the po
24f0: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68  licies of all th
2500: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20  e certificates. 
2510: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65  *. * Args. *.pre
2520: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61  verify_ok indica
2530: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  tes whether the 
2540: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69  certificate veri
2550: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20  fication passed 
2560: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20  (1) or not (0). 
2570: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2580: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e  .A callback boun
2590: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20  d to the socket 
25a0: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  may return one o
25b0: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20  f:. *.    0...- 
25c0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
25d0: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69  is deemed invali
25e0: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61  d, send verifica
25f0: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69  tion. *....  fai
2600: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65  lure alert to pe
2610: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  er, and terminat
2620: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
2630: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65      1...- the ce
2640: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
2650: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69  med valid, conti
2660: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61  nue with handsha
2670: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79  ke.. *.    empty
2680: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61   string.- no cha
2690: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61  nge to certifica
26a0: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a  te validation. *
26b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
26c0: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
26d0: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
26e0: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
26f0: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2700: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
2710: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
2720: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
2730: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d  re reason. *. *-
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
2790: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  t.VerifyCallback
27a0: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54  (int ok, X509_ST
27b0: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a  ORE_CTX *ctx) {.
27c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
27d0: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a  Ptr;.    SSL   *
27e0: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30  ssl..= (SSL*)X50
27f0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
2800: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c  ex_data(ctx, SSL
2810: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30  _get_ex_data_X50
2820: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28  9_STORE_CTX_idx(
2830: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63  ));.    X509  *c
2840: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  ert..= X509_STOR
2850: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e  E_CTX_get_curren
2860: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20  t_cert(ctx);.   
2870: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
2880: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67  .= (State*)SSL_g
2890: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29  et_app_data(ssl)
28a0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
28b0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
28c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
28d0: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35   int depth..= X5
28e0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
28f0: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78  _error_depth(ctx
2900: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09  );.    int err..
2910: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
2920: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b  _get_error(ctx);
2930: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
2940: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b  erify: %d", ok);
2950: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
2960: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
2970: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69  _Obj*)NULL) {..i
2980: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c  f (statePtr->vfl
2990: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59  ags & SSL_VERIFY
29a0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
29b0: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65  _CERT) {..    re
29c0: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65  turn ok;..} else
29d0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31   {..    return 1
29e0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
29f0: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c  if (cert == NULL
2a00: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29   || ssl == NULL)
2a10: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
2a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2a30: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2a40: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
2a50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2a60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2a70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2a90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2aa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2ab0: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2ac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2ad0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ae0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2af0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
2b00: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2b10: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2b20: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2b30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2b60: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2b70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2b80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2b90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2ba0: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2bb0: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
2c00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c20: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2c30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2c40: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2c50: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2c60: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2c70: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f    /* Prevent I/O
2c80: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20   while callback 
2c90: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a  is in progress *
2ca0: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  /.    /* statePt
2cb0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2cc0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f  TCL_CALLBACK; */
2cd0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2ce0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2cf0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2d00: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2d10: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2d20: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2d30: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2d40: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2d50: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2d60: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2d70: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2d80: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2d90: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2da0: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2db0: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2dc0: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2dd0: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2e20: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2e30: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2e40: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2e50: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2e60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2e70: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2e80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2e90: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2ea0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2eb0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
2ec0: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
2ed0: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
2ee0: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
2f40: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
2f50: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
2f60: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
2f70: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
2f80: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
2f90: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
2fa0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
2fb0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
2fc0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
2fd0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
2fe0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
2ff0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3000: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3010: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
3020: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
3030: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3040: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
3050: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
3060: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3070: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3080: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3090: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
30a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
30b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
30c0: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
30d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
30e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
30f0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3100: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3110: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
3120: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
3130: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
3140: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
3150: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
3160: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3170: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3180: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3190: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
31a0: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
31b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
31c0: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
31d0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 54  sult(interp), (T
31e0: 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 29  cl_Size *)NULL))
31f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
3200: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3210: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3220: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3230: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29  ingObj(msg, -1))
3240: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
3250: 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e  .listPtr = Tcl_N
3260: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
3270: 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72  L);..while ((err
3280: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72   = ERR_get_error
3290: 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  ()) != 0) {..   
32a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
32b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32c0: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
32d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f  ewStringObj(ERR_
32e0: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
32f0: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a  ing(err), -1));.
3300: 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  .}..Tcl_ListObjA
3310: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3320: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73  erp, cmdPtr, lis
3330: 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tPtr);.    }..  
3340: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
3350: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
3360: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
3370: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
3380: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
3390: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
33a0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
33b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
33c0: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43  --. *. * KeyLogC
3420: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
3430: 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20  .Write received 
3440: 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20  key data to log 
3450: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  file.. *. * Side
3460: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
3470: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
34c0: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  oid KeyLogCallba
34d0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
34e0: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  l, const char *l
34f0: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20  ine) {.    char 
3500: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53  *str = getenv(SS
3510: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20  LKEYLOGFILE);.  
3520: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20    FILE *fd;..   
3530: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3540: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72  ");..    if (str
3550: 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28  ) {..fd = fopen(
3560: 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69  str, "a");..fpri
3570: 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c  ntf(fd, "%s\n",l
3580: 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64  ine);..fclose(fd
3590: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  );.    }.}.../*.
35a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73  -----. *. * Pass
35f0: 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d  word Callback --
3600: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68  . *. *.Called wh
3610: 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66 6f  en a password fo
3620: 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 20  r a private key 
3630: 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20  loading/storing 
3640: 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 69  a PEM. *.certifi
3650: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70  cate with encryp
3660: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c  tion. Evals call
3670: 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64 20  back script and 
3680: 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 72  returns. *.the r
3690: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73  esult as the pas
36a0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20  sword string in 
36b0: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  buf.. *. * Resul
36c0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
36d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
36e0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
36f0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
3700: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
3710: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69  .Password size i
3720: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f  n bytes or -1 fo
3730: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  r an error.. *. 
3740: 2a 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 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3790: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
37a0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
37b0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77  int size, int rw
37c0: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74  flag, void *udat
37d0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
37e0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
37f0: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
3800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3810: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
3820: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
3830: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
3840: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64  int code;..    d
3850: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
3860: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ;..    /* If no 
3870: 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65  callback, use de
3880: 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a  fault callback *
3890: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
38a0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20  tr->password == 
38b0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c  NULL) {..if (Tcl
38c0: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20  _EvalEx(interp, 
38d0: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c  "tls::password",
38e0: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
38f0: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  OBAL) == TCL_OK)
3900: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
3910: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
3920: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
3930: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73  (interp);..    s
3940: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
3950: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
3960: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3970: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09  t)strlen(ret);..
3980: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
3990: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20  turn -1;..}.    
39a0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
39b0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
39c0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
39d0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
39e0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
39f0: 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  word);.    Tcl_L
3a00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3a10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3a20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3a30: 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c  gObj("password",
3a40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
3a50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3a60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3a70: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3a80: 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20  j(rwflag));.    
3a90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3aa0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3ab0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3ac0: 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a  IntObj(size));..
3ad0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3ae0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3af0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
3b00: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
3b10: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3b20: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3b30: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3b40: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3b50: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3b60: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
3b70: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
3b80: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
3b90: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66  _GLOBAL);.    if
3ba0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
3bb0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
3bc0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
3bd0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
3be0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
3bf0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
3c00: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
3c10: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3c20: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
3c30: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
3c40: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
3c50: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3c60: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
3c70: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
3c80: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3c90: 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   /* If successfu
3ca0: 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 73  l, pass back pas
3cb0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64  sword string and
3cc0: 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f   truncate if too
3cd0: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20   long */.    if 
3ce0: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29  (code == TCL_OK)
3cf0: 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 6e   {..Tcl_Size len
3d00: 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28  ;..char *ret = (
3d10: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
3d20: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c  tringFromObj(Tcl
3d30: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
3d40: 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69  terp), &len);..i
3d50: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69  f (len > (Tcl_Si
3d60: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20  ze) size-1) {.. 
3d70: 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69     len = (Tcl_Si
3d80: 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09  ze) size-1;..}..
3d90: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3da0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
3db0: 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ..buf[len] = '\0
3dc0: 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28  ';..Tcl_Release(
3dd0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3de0: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28 69  erp);..return((i
3df0: 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  nt) len);.    }.
3e00: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3e10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3e20: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  erp);.    return
3e30: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d   -1;.}.../*. *--
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20  -. *. * Session 
3e90: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
3ea0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  ents --. *. *.Ca
3eb0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
3ec0: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64  session is added
3ed0: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49   to the cache. I
3ee0: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69  n TLS 1.3. *.thi
3ef0: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65  s may be receive
3f00: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
3f10: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73   after the hands
3f20: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72  hake. For. *.ear
3f30: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74  lier versions, t
3f40: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65  his will be rece
3f50: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  ived during the 
3f60: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68  handshake.. *.Th
3f70: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72  is is the prefer
3f80: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69  red way to obtai
3f90: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65  n a resumable se
3fa0: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ssion.. *. * Res
3fb0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
3fc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3fd0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
3fe0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
3ff0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4000: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f  des:. *.0 = erro
4010: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20  r where session 
4020: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74  will be immediat
4030: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  ely removed from
4040: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
4050: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63  che.. *.1 = succ
4060: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65  ess where app re
4070: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e  tains session in
4080: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20   session cache, 
4090: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53  and must call SS
40a0: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29  L_SESSION_free()
40b0: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20   when done.. *. 
40c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4110: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62  int.SessionCallb
4120: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
4130: 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  sl, SSL_SESSION 
4140: 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20  *session) {.    
4150: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
4160: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
4170: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20  t_app_data((SSL 
4180: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  *)ssl);.    Tcl_
4190: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
41a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
41b0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
41c0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  cmdPtr;.    cons
41d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
41e0: 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e  *ticket;.    con
41f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4200: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20   *session_id;.  
4210: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20    size_t len2;. 
4220: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
4230: 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ulen;..    dprin
4240: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
4250: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4260: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
4270: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
4280: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4290: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
42a0: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
42b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
42c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
42d0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
42e0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
42f0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
4300: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
4310: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
4320: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
4330: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4340: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4350: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4360: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4370: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
4380: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4390: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
43a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
43b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
43c0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
43d0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
43e0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  self), -1));..  
43f0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20    /* Session id 
4400: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69  */.    session_i
4410: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
4420: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
4430: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  &ulen);.    Tcl_
4440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4450: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4460: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
4470: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e  ArrayObj(session
4480: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
4490: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
44a0: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
44b0: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
44c0: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
44d0: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
44e0: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
44f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4500: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4510: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
4520: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
4530: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
4540: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65  ));..    /* Life
4550: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66  time - number of
4560: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20   seconds */.    
4570: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4580: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4590: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
45a0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20  wLongObj((long) 
45b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
45c0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
45d0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
45e0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
45f0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
4600: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
4610: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4620: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
4630: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4640: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
4650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
4670: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 0;.}.../*. 
4680: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20  ----. *. * ALPN 
46d0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72  Callback for Ser
46e0: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c  vers and NPN Cal
46f0: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74  lback for Client
4700: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
4710: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74  rm protocol (htt
4720: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65  p/1.1, h2, h3, e
4730: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66  tc.) selection f
4740: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69  or the. *.incomi
4750: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43  ng connection. C
4760: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c  alled after Hell
4770: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c  o and server cal
4780: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65  lbacks.. *.Where
4790: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74   'out' is select
47a0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20  ed protocol and 
47b0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72  'in' is the peer
47c0: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74   advertised list
47d0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
47e0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
47f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4800: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4810: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
4820: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
4830: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4840: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  R_OK: ALPN proto
4850: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
4860: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4870: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
4880: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
4890: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73  FATAL: There was
48a0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77   no overlap betw
48b0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73  een the client's
48c0: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64  . *.    supplied
48d0: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65   list and the se
48e0: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  rver configurati
48f0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
4900: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74  on will be abort
4910: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ed.. *.SSL_TLSEX
4920: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50  T_ERR_NOACK: ALP
4930: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  N protocol not s
4940: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62  elected, e.g., b
4950: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20  ecause no ALPN. 
4960: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20  *.    protocols 
4970: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66  are configured f
4980: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  or this connecti
4990: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
49a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
49b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4a00: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61  c int.ALPNCallba
4a10: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
4a20: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
4a30: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
4a40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74  signed char *out
4a50: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len,..const unsi
4a60: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75  gned char *in, u
4a70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65  nsigned int inle
4a80: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
4a90: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4aa0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
4ab0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
4ac0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4ad0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4ae0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4af0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
4b00: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e   res;..    dprin
4b10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
4b20: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
4b30: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
4b40: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4b50: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4b60: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
4b70: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c   Select protocol
4b80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f   */.    if (SSL_
4b90: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74  select_next_prot
4ba0: 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73  o(out, outlen, s
4bb0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c  tatePtr->protos,
4bc0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4bd0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65  s_len,..in, inle
4be0: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50  n) == OPENSSL_NP
4bf0: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a  N_NEGOTIATED) {.
4c00: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20  ./* Match found 
4c10: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4c20: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4c30: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50   } else {../* OP
4c40: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45  ENSSL_NPN_NO_OVE
4c50: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61  RLAP = No overla
4c60: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20  p, so use first 
4c70: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74  item from client
4c80: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a   protocol list *
4c90: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  /..res = SSL_TLS
4ca0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4cb0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
4cc0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
4cd0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4ce0: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20  {..return res;. 
4cf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4d00: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4d10: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
4d20: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
4d30: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
4d40: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
4d50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4d60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4d70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4d80: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
4d90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4da0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4db0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4dc0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
4dd0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
4de0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
4df0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
4e00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4e10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4e20: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4e30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75  NewStringObj(*ou
4e40: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  t, -1));.    Tcl
4e50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4e60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4e70: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  dPtr, Tcl_NewBoo
4e80: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53  leanObj(res == S
4e90: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4ea0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
4eb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
4ec0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
4ed0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
4ee0: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
4ef0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
4f00: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4f10: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
4f20: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
4f30: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4f40: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
4f50: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
4f60: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f70: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4f80: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
4f90: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4fa0: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  TAL;.    }.    T
4fb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4fc0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
4fd0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
4fe0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65  -----. *. * Adve
5030: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20  rtise Protocols 
5040: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78  Callback for Nex
5050: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  t Protocol Negot
5060: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20  iation (NPN) in 
5070: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20  ServerHello --. 
5080: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e  *. *.called when
5090: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65   a TLS server ne
50a0: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75  eds a list of su
50b0: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c  pported protocol
50c0: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72  s for Next. *.Pr
50d0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
50e0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
50f0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
5100: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5110: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
5120: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
5130: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f  _ERR_OK: NPN pro
5140: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20  tocol selected. 
5150: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5160: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
5170: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5180: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  K: NPN protocol 
5190: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68  not selected. Th
51a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
51b0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  . */.#ifdef USE_
5210: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e  NPN.static int.N
5220: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  PNCallback(const
5230: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
5240: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5250: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69  *out, unsigned i
5260: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64  nt *outlen, void
5270: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
5280: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
5290: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20  State*)arg;..   
52a0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
52b0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
52c0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
52d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
52e0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
52f0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
5300: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f      /* Set proto
5310: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20  cols list */.   
5320: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
5330: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
5340: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74  ..*out = statePt
5350: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74  r->protos;..*out
5360: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  len = statePtr->
5370: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20  protos_len;.    
5380: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d  } else {..*out =
5390: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20   NULL;..*outlen 
53a0: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  = 0;..return SSL
53b0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
53c0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
53d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
53e0: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RR_OK;.}.#endif.
53f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5440: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f   SNI Callback fo
5450: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a  r Servers --. *.
5460: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65   *.Perform serve
5470: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e  r-side SNI hostn
5480: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66  ame selection af
5490: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e  ter receiving SN
54a0: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69  I extension. *.i
54b0: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20  n Client Hello. 
54c0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c  Called after hel
54d0: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20  lo callback but 
54e0: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c  before ALPN call
54f0: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  back.. *. * Resu
5500: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
5510: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5520: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
5530: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
5540: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
5550: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
5560: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f  T_ERR_OK: SNI ho
5570: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74  stname is accept
5580: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5590: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
55a0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
55b0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49  ALERT_FATAL: SNI
55c0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
55d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
55e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20  onnection. *.   
55f0: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66   is aborted. Def
5600: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69  ault for alert i
5610: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  s SSL_AD_UNRECOG
5620: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53  NIZED_NAME.. *.S
5630: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5640: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49  ERT_WARNING: SNI
5650: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5660: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69   accepted, warni
5670: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20  ng alert. *.    
5680: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72  sent (not suppor
5690: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e  ted in TLSv1.3).
56a0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
56b0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
56c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
56d0: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  CK: SNI hostname
56e0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
56f0: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c   and not acknowl
5700: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e  edged,. *.    e.
5710: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f  g. if SNI has no
5720: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  t been configure
5730: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
5740: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
5750: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
57a0: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b   int.SNICallback
57b0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
57c0: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
57d0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
57e0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
57f0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
5800: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5810: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
5820: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
5830: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
5840: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
5850: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
5860: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  name = NULL;..  
5870: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
5880: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5890: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
58a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
58b0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
58c0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
58d0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72  .    /* Only wor
58e0: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61  ks for TLS 1.2 a
58f0: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20  nd earlier */.  
5900: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53    servername = S
5910: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
5920: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
5930: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
5940: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76  );.    if (!serv
5950: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72  ername || server
5960: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  name[0] == '\0')
5970: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5980: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5990: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
59a0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
59b0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
59c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
59d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
59e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
59f0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
5a00: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
5a10: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
5a20: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
5a30: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
5a40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5a50: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5a60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5a70: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b  Obj("sni", -1));
5a80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5a90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5aa0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
5ab0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5ac0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5ad0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5ae0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5af0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5b00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5b10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5b20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76  ewStringObj(serv
5b30: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a  ername , -1));..
5b40: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
5b50: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
5b60: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5b70: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5b80: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
5b90: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
5ba0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
5bb0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
5bc0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5bd0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
5be0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5bf0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5c00: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
5c10: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
5c20: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20  3 */.    } else 
5c30: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
5c40: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5c50: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5c60: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
5c70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5c80: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65  ERT_FATAL;..*ale
5c90: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5ca0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5cb0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5cc0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5cd0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5ce0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5d00: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5d50: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  *. * ClientHello
5d60: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62   Handshake Callb
5d70: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
5d80: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79  --. *. *.Used by
5d90: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69   server to exami
5da0: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ne the server na
5db0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
5dc0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  NI) extension. *
5dd0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65  .provided by the
5de0: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72   client in order
5df0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70   to select an ap
5e00: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66  propriate certif
5e10: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73  icate to. *.pres
5e20: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74  ent, and make ot
5e30: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
5e40: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65  n adjustments re
5e50: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73  levant to that s
5e60: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e  erver. *.name an
5e70: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74  d its configurat
5e80: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64  ion. This includ
5e90: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20  es swapping out 
5ea0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
5eb0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65  *.SSL_CTX pointe
5ec0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  r, modifying the
5ed0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f   server's list o
5ee0: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20  f permitted TLS 
5ef0: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61  versions,. *.cha
5f00: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  nging the server
5f10: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69  's cipher list i
5f20: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  n response to th
5f30: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65  e client's ciphe
5f40: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09  r list, etc.. *.
5f50: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e  Called before SN
5f60: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62  I and ALPN callb
5f70: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  acks.. *. * Resu
5f80: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
5f90: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5fa0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
5fb0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
5fc0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
5fd0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  es:. *.SSL_CLIEN
5fe0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73  T_HELLO_RETRY: s
5ff0: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73  uspend the hands
6000: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61  hake, and the ha
6010: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e  ndshake function
6020: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d   will return imm
6030: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f  ediately. *.SSL_
6040: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6050: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72  OR: failure, ter
6060: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f  minate connectio
6070: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20  n. Set alert to 
6080: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53  error code.. *.S
6090: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
60a0: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73  SUCCESS: success
60b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
6100: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61  atic int.HelloCa
6110: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
6120: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
6130: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
6140: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6150: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
6160: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
6170: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
6180: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
6190: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
61a0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
61b0: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
61c0: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
61d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
61e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
61f0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65    size_t len, re
6200: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70  maining;..    dp
6210: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6220: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
6230: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
6240: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
6250: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6260: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
6270: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
6280: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c  sl == (const SSL
6290: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d   *)NULL || arg =
62a0: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20  = (void *)NULL) 
62b0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
62c0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
62d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
62e0: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  Get names */.   
62f0: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74   if (!SSL_client
6300: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28  _hello_get0_ext(
6310: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45  ssl, TLSEXT_TYPE
6320: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70  _server_name, &p
6330: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c  , &remaining) ||
6340: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29   remaining <= 2)
6350: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6360: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
6370: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
6380: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6390: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
63a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
63b0: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
63c0: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
63d0: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
63e0: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
63f0: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
6400: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
6410: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
6420: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
6430: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6440: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
6450: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
6460: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6470: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6480: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6490: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20  ing = len;..    
64a0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70  /* The list in p
64b0: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73  ractice only has
64c0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
64d0: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f  t, so we only co
64e0: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74  nsider the first
64f0: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20   one. */.    if 
6500: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20  (remaining == 0 
6510: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58  || *p++ != TLSEX
6520: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
6530: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20  name) {..*alert 
6540: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6550: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6560: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6570: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6580: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
6590: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20  maining--;..    
65a0: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69  /* Now we can fi
65b0: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74  nally pull out t
65c0: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69  he byte array wi
65d0: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f  th the actual ho
65e0: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69  stname. */.    i
65f0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  f (remaining <= 
6600: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
6610: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6620: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6630: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6640: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
6660: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6670: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6680: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6690: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20   2 > remaining) 
66a0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
66b0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
66c0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
66d0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
66e0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
66f0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6700: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72  g = len;.    ser
6710: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  vername = (const
6720: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20   char *)p;..    
6730: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
6740: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
6750: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
6760: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
6770: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
6780: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6790: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
67a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
67b0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f  StringObj("hello
67c0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
67d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
67e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
67f0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
6800: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
6810: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
6820: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
6830: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
6840: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6850: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6860: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6870: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20  Obj(servername, 
6880: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29  (Tcl_Size) len))
6890: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
68a0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
68b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
68c0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
68d0: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
68e0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
68f0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
6900: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
6910: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e  .res = SSL_CLIEN
6920: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09  T_HELLO_RETRY;..
6930: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6940: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f  LSV1_ALERT_USER_
6950: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d  CANCELLED;.    }
6960: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
6970: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
6980: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6990: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
69a0: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
69b0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
69c0: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  OR;..*alert = SS
69d0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
69e0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
69f0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
6a00: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
6a10: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
6a20: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  es;.}.../*******
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
6a40: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20  * Commands      
6a50: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6a70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
6ac0: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
6ad0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
6ae0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
6af0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
6b00: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
6b10: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
6b20: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
6b30: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
6b40: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
6b50: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
6b60: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
6b70: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6b80: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
6b90: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
6ba0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
6bb0: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
6bc0: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
6bd0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6c20: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6c30: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
6c40: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22  ] = {.."ssl2", "
6c50: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
6c60: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
6c70: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
6c80: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
6c90: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
6ca0: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
6cb0: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
6cc0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
6cd0: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
6ce0: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
6cf0: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
6d00: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
6d10: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
6d20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
6d30: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
6d40: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
6d50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
6d60: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tr = NULL;.    S
6d70: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
6d80: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  LL;.    SSL *ssl
6d90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41   = NULL;.    STA
6da0: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52  CK_OF(SSL_CIPHER
6db0: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20  ) *sk;.    char 
6dc0: 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d  *cp, buf[BUFSIZ]
6dd0: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
6de0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
6df0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
6e00: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
6e10: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
6e20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6e30: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
6e40: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f  (objc < 2) || (o
6e50: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c  bjc > 4)) {..Tcl
6e60: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6e70: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6e80: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73  protocol ?verbos
6e90: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29  e? ?supported?")
6ea0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6eb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
6ec0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
6ed0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6ee0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
6ef0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
6f00: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
6f10: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6f20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6f30: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
6f40: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
6f50: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
6f60: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
6f70: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
6f80: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6f90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6fa0: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20   if ((objc > 3) 
6fb0: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
6fc0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
6fd0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73   objv[3], &use_s
6fe0: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c  upported) != TCL
6ff0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
7000: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7010: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
7020: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69  rror();..    swi
7030: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f  tch ((enum proto
7040: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61  col)index) {..ca
7050: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66  se TLS_SSL2:.#if
7060: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
7070: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
7080: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
7090: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
70a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
70b0: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f  _SSL2)..    Tcl_
70c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
70d0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
70e0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
70f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7100: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7110: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7120: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7130: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
7140: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7150: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
7160: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
7170: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
7180: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7190: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
71a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
71b0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
71c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
71d0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
71e0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
71f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7200: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7210: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7220: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7230: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f  od = SSLv3_metho
7240: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7250: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
7260: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
7270: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7280: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7290: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
72a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
72b0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
72c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
72d0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
72e0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
72f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7300: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7320: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7330: 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f  od = TLSv1_metho
7340: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7350: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
7360: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_1:.#if defined
7370: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
7380: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7390: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
73a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
73b0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_1_METHOD)..
73c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
73d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
73e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
73f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7400: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
7410: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7420: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7430: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53      method = TLS
7440: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62  v1_1_method(); b
7450: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7460: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23  se TLS_TLS1_2:.#
7470: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7480: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
7490: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
74a0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
74b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
74c0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
74d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
74e0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
74f0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7500: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7510: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
7520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7530: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
7540: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d  thod = TLSv1_2_m
7550: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
7560: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
7570: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66  _TLS1_3:.#if def
7580: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
7590: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
75a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20  SL_NO_TLS1_3).. 
75b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
75c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
75d0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
75e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
75f0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7600: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7610: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7620: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f     method = TLS_
7630: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53  method();..    S
7640: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
7650: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
7660: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
7670: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
7680: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
7690: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
76a0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20  3_VERSION);..   
76b0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
76c0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65  default:..    me
76d0: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f  thod = TLS_metho
76e0: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  d();..    break;
76f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20  .    }..    ctx 
7700: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
7710: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63  thod);.    if (c
7720: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
7730: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7740: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29  interp, REASON()
7750: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
7760: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7770: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c  }..    ssl = SSL
7780: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
7790: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
77a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
77b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
77c0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53  ON(), NULL);..SS
77d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
77e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
77f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
7800: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f  * Use list and o
7810: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65  rder as would be
7820: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e   sent in a Clien
7830: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76  tHello or all av
7840: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20  ailable ciphers 
7850: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73  */.    if (use_s
7860: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20  upported) {..sk 
7870: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f  = SSL_get1_suppo
7880: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c  rted_ciphers(ssl
7890: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
78a0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69  .sk = SSL_get_ci
78b0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
78c0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d  }..    if (sk !=
78d0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76   NULL) {..if (!v
78e0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f  erbose) {..    o
78f0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7900: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
7910: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
7920: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
7930: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
7940: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
7950: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
7960: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
7970: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
7980: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
7990: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70  tinue;..../* cip
79a0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e  her name or (NON
79b0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c  E) */...cp = SSL
79c0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
79d0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d  (c);...if (cp ==
79e0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09   NULL) break;...
79f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
7a00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
7a10: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
7a20: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31  StringObj(cp, -1
7a30: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65  ));..    }...} e
7a40: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74  lse {..    objPt
7a50: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
7a60: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20  gObj("",0);..   
7a70: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7a80: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7a90: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7aa0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7ab0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7ac0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7ad0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7ae0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7af0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20  ;..../* textual 
7b00: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
7b10: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69  he cipher */...i
7b20: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
7b30: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66  scription(c, buf
7b40: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
7b50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
7b60: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7b70: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63  objPtr, buf, (Tc
7b80: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62  l_Size) strlen(b
7b90: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  uf));...} else {
7ba0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7bb0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22  dToObj(objPtr, "
7bc0: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a  UNKNOWN\n", 8);.
7bd0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69  ..}..    }..}..i
7be0: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64  f (use_supported
7bf0: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f  ) {..    sk_SSL_
7c00: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b  CIPHER_free(sk);
7c10: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  ..}.    }.    SS
7c20: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20  L_free(ssl);.   
7c30: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
7c40: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  x);..    Tcl_Set
7c50: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
7c60: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
7c70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
7c80: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
7c90: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
7ca0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f  ----. *. * Proto
7cf0: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  colsObjCmd -- li
7d00: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
7d10: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69  tocols. *. *.Thi
7d20: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
7d30: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
7d40: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74  s the "tls::prot
7d50: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  ocols" command. 
7d60: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
7d70: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20  ble protocols.. 
7d80: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7d90: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
7da0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a  result list.. *.
7db0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7dc0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e10: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
7e20: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64  .ProtocolsObjCmd
7e30: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
7e40: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
7e50: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
7e60: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
7e70: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
7e80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
7e90: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
7ea0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
7eb0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20   if (objc != 1) 
7ec0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
7ed0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
7ee0: 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72  bjv, "");..retur
7ef0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7f00: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
7f10: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
7f20: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7f30: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7f40: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
7f50: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
7f60: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
7f70: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
7f80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
7f90: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
7fa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7fb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
7fc0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
7fd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
7fe0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c  ocols[TLS_SSL2],
7ff0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8000: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
8010: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
8020: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
8030: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8040: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
8050: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
8060: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8070: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8080: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8090: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
80a0: 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL3], -1));.#e
80b0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
80c0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
80d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
80e0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
80f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8100: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
8110: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8120: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8130: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8140: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8150: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d  ols[TLS_TLS1], -
8160: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8170: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8180: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
8190: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
81a0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
81b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
81c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
81d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
81e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
81f0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
8200: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
8210: 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31  [TLS_TLS1_1], -1
8220: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
8230: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
8240: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
8250: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
8260: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8270: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f  ENSSL_NO_TLS1_2_
8280: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8290: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
82a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
82b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
82c0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
82d0: 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29  TLS_TLS1_2], -1)
82e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
82f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
8300: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8310: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
8320: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
8330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8340: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
8350: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
8360: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8370: 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_3], -1));.#end
8380: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  if..    Tcl_SetO
8390: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
83a0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
83b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
83c0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
83d0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8420: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
8430: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
8440: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
8450: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
8460: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
8470: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
8480: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
8490: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
84a0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
84b0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
84c0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
84d0: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
84e0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
84f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
8500: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
8510: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
8520: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
8580: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
8590: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
85a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
85b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
85c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
85d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
85e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
85f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8600: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
8610: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
8620: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
8630: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
8640: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
8650: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
8660: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
8670: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
8680: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
8690: 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20  t err = 0;..    
86a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
86b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
86c0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
86d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
86e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
86f0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28  nnel");..return(
8700: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
8710: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8720: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8730: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8740: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8750: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8760: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f  j(objv[1], (Tcl_
8770: 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55  Size *)NULL), NU
8780: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
8790: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
87a0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
87b0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
87c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
87d0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
87e0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
87f0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
8800: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
8810: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
8820: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
8830: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
8840: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
8850: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
8860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8870: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
8880: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
8890: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
88a0: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54      "\": not a T
88b0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
88c0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
88d0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
88e0: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
88f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
8900: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
8910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
8920: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
8930: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
8940: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
8950: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
8960: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
8970: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
8980: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
8990: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20  nect");.    ret 
89a0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
89b0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
89c0: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72  err, 1);.    dpr
89d0: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f  intf("Tls_WaitFo
89e0: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65  rConnect returne
89f0: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20  d: %i", ret);.. 
8a00: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26     if (ret < 0 &
8a10: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  & ((statePtr->fl
8a20: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
8a30: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20  YNC) && (err == 
8a40: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72  EAGAIN))) {..dpr
8a50: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20  intf("Async set 
8a60: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e  and err = EAGAIN
8a70: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20  ");..ret = 0;.  
8a80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74    } else if (ret
8a90: 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65   < 0) {..long re
8aa0: 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20  sult;..errStr = 
8ab0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09  statePtr->err;..
8ac0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
8ad0: 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65  interp);..Tcl_Se
8ae0: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69  tErrno(err);...i
8af0: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a  f (!errStr || (*
8b00: 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a  errStr == 0)) {.
8b10: 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63  .    errStr = Tc
8b20: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
8b30: 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41  erp);..}...Tcl_A
8b40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8b50: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66  rp, "handshake f
8b60: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72  ailed: ", errStr
8b70: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
8b80: 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d  ;..if ((result =
8b90: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
8ba0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
8bb0: 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56  >ssl)) != X509_V
8bc0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  _OK) {..    Tcl_
8bd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8be0: 65 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22  erp, " due to: "
8bf0: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  , X509_verify_ce
8c00: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
8c10: 72 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a  result), (char *
8c20: 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  ) NULL);..}..Tcl
8c30: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
8c40: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8c50: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
8c60: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
8c70: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
8c80: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
8c90: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
8ca0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
8cb0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54  rStr);..return(T
8cc0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8cd0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72   else {..if (err
8ce0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   != 0) {..    dp
8cf0: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72  rintf("Got an er
8d00: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c  ror with a compl
8d10: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20  eted handshake: 
8d20: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b  err = %i", err);
8d30: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20  ..}..ret = 1;.  
8d40: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
8d50: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
8d60: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25  OK with data \"%
8d70: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20  i\"", ret);.    
8d80: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8d90: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
8da0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20  IntObj(ret));.  
8db0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
8dc0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
8dd0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f  clientData;.}../
8de0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
8e30: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
8e40: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
8e50: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
8e60: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
8e70: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
8e80: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
8e90: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
8ea0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
8eb0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
8ec0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
8ed0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
8ee0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
8ef0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
8f00: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
8f10: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
8f20: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
8f80: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
8f90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
8fa0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
8fb0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
8fc0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
8fd0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
8fe0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
8ff0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
9000: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
9010: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
9020: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
9030: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
9040: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
9050: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
9060: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63  .    Tcl_Obj *sc
9080: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e  ript.        = N
9090: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
90a0: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20   *password.     
90b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
90c0: 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20  cl_Obj *vcmd.   
90d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
90e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70   Tcl_DString upp
90f0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
9100: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e  tion, upperChann
9110: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65  elBlocking, uppe
9120: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
9130: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  , upperChannelEO
9140: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69  FChar;.    int i
9150: 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  dx;.    Tcl_Size
9160: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c   len;.    int fl
9170: 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54  ags..        = T
9180: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20  LS_TCL_INIT;.   
9190: 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20   int server..   
91a0: 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20       = 0;./* is 
91b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d  connection incom
91c0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f  ing or outgoing?
91d0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65   */.    char *ke
91e0: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  yfile.        = 
91f0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9200: 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20  certfile.       
9210: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73   = NULL;.    uns
9220: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
9230: 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63   .= NULL;.    Tc
9240: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 20  l_Size key_len  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
9260: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
9270: 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20   char *cert     
9280: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9290: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
92a0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
92b0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
92c0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
92d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
92e0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
92f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9300: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
9310: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9320: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
9330: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9340: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
9350: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
9360: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
9370: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
9380: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
9390: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
93a0: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
93b0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
93c0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
93d0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
93e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
93f0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
9400: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70      Tcl_Obj *alp
9410: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  n..= NULL;.    i
9420: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
9430: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
9440: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
9450: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
9460: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
9470: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
9480: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
9490: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
94a0: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
94b0: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
94c0: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20  andshake = 0;.. 
94d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
94e0: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
94f0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
9500: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9510: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31  O_TLS1).    tls1
9520: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
9530: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9540: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
9550: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
9560: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30  ).    tls1_1 = 0
9570: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9580: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
9590: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
95a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
95b0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65    tls1_2 = 0;.#e
95c0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
95d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
95e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
95f0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c  O_TLS1_3).    tl
9600: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_3 = 0;.#endif
9610: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
9620: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
9630: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9640: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
9650: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09  l ?options?");..
9660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9670: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
9680: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
9690: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
96a0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
96b0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
96c0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
96d0: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c   (Tcl_Size *)NUL
96e0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
96f0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9700: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9710: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9720: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
9730: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
9740: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
9750: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
9760: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9770: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
9780: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
9790: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
97a0: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
97b0: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
97c0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
97d0: 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53  bjv[idx], (Tcl_S
97e0: 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69  ize *)NULL);...i
97f0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
9800: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  )..    break;...
9810: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20  OPTOBJ("-alpn", 
9820: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  alpn);..OPTSTR("
9830: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b  -cadir", CAdir);
9840: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c  ..OPTSTR("-cafil
9850: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50  e", CAfile);..OP
9860: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63  TBYTE("-cert", c
9870: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a  ert, cert_len);.
9880: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69  .OPTSTR("-certfi
9890: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a  le", certfile);.
98a0: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
98b0: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
98c0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c  TSTR("-ciphers",
98d0: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
98e0: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65  TR("-ciphersuite
98f0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  s", ciphersuites
9900: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d  );..OPTOBJ("-com
9910: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
9920: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61  .OPTSTR("-dhpara
9930: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a  ms", DHparams);.
9940: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c  .OPTBYTE("-key",
9950: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a   key, key_len);.
9960: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c  .OPTSTR("-keyfil
9970: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f  e", keyfile);..O
9980: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20  PTSTR("-model", 
9990: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
99a0: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
99b0: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
99c0: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ("-post_handshak
99d0: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61  e", post_handsha
99e0: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  ke);..OPTBOOL("-
99f0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73  request", reques
9a00: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  t);..OPTBOOL("-r
9a10: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65  equire", require
9a20: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63  );..OPTINT("-sec
9a30: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76  uritylevel", lev
9a40: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  el);..OPTBOOL("-
9a50: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29  server", server)
9a60: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76  ;..OPTSTR("-serv
9a70: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e  ername", servern
9a80: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ame);..OPTSTR("-
9a90: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
9aa0: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f  sion_id);..OPTBO
9ab0: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32  OL("-ssl2", ssl2
9ac0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
9ad0: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54  l3", ssl3);..OPT
9ae0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c  BOOL("-tls1", tl
9af0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  s1);..OPTBOOL("-
9b00: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29  tls1.1", tls1_1)
9b10: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9b20: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
9b30: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33  OPTBOOL("-tls1.3
9b40: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54  ", tls1_3);..OPT
9b50: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f  OBJ("-validateco
9b60: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09  mmand", vcmd);..
9b70: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20  OPTOBJ("-vcmd", 
9b80: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28  vcmd);...OPTBAD(
9b90: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e  "option", "-alpn
9ba0: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c  , -cadir, -cafil
9bb0: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66  e, -cert, -certf
9bc0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
9bd0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f  iphersuites, -co
9be0: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73  mmand, -dhparams
9bf0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65  , -key, -keyfile
9c00: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
9c10: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73  ord, -post_hands
9c20: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20  hake, -request, 
9c30: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72  -require, -secur
9c40: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65  itylevel, -serve
9c50: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
9c60: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73  -session_id, -ss
9c70: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31  l2, -ssl3, -tls1
9c80: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31  , -tls1.1, -tls1
9c90: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20  .2, -tls1.3, or 
9ca0: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
9cb0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
9cc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9cd0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09    if (request)..
9ce0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9cf0: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
9d00: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45   | SSL_VERIFY_PE
9d10: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  ER;.    if (requ
9d20: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09  est && require).
9d30: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9d40: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
9d50: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69  PEER_CERT;.    i
9d60: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
9d70: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65  st_handshake).ve
9d80: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
9d90: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
9da0: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66  E;.    if (verif
9db0: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20  y == 0)..verify 
9dc0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
9dd0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
9de0: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
9df0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
9e00: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
9e10: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
9e20: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
9e30: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
9e40: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
9e50: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9e60: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
9e70: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
9e80: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
9e90: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
9ea0: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
9eb0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9ec0: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
9ed0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
9ee0: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
9ef0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
9f00: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
9f10: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
9f20: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
9f30: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
9f40: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
9f50: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
9f60: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
9f70: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
9f80: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
9f90: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
9fa0: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
9fb0: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
9fc0: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
9fd0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
9fe0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
9ff0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
a000: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
a010: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
a020: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a030: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
a040: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
a050: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
a060: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
a070: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
a080: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
a090: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a0a0: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26      if (CAdir &&
a0b0: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20   !*CAdir).      
a0c0: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20    CAdir.        
a0d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a0e0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
a0f0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
a100: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
a110: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
a120: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
a130: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
a140: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
a150: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
a160: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
a170: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
a180: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
a190: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
a1a0: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
a1b0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
a1c0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
a1d0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
a1e0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79  >vflags.= verify
a1f0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a200: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f  err.= "";..    /
a210: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70  * allocate scrip
a220: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72  t */.    if (scr
a230: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ipt) {..(void) T
a240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a250: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e  Obj(script, &len
a260: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a270: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61      statePtr->ca
a280: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b  llback = script;
a290: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
a2a0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
a2b0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20  >callback);..}. 
a2c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
a2d0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a  ocate password *
a2e0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f  /.    if (passwo
a2f0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  rd) {..(void) Tc
a300: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a310: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65  bj(password, &le
a320: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
a330: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
a340: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f  assword = passwo
a350: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  rd;..    Tcl_Inc
a360: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a370: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
a380: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a390: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74  allocate validat
a3a0: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
a3b0: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76   if (vcmd) {..(v
a3c0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
a3d0: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20  ngFromObj(vcmd, 
a3e0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a3f0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a400: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09  ->vcmd = vcmd;..
a410: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a420: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
a430: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  cmd);..}.    }..
a440: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
a450: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
a460: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
a470: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
a480: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
a490: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
a4a0: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b  , model, &mode);
a4b0: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54  ..if (chan == (T
a4c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
a4d0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
a4e0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a4f0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a500: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a510: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
a520: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
a530: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
a540: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
a550: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
a560: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28  nel(chan);..if (
a570: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
a580: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
a590: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
a5a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
a5b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a5c0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
a5d0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
a5e0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
a5f0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
a600: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
a610: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a620: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a630: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
a640: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
a650: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a660: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
a670: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a680: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a690: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
a6a0: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
a6b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
a6c0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
a6d0: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
a6e0: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
a6f0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
a700: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
a710: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
a720: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
a730: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09  (int) key_len,..
a740: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c      (int) cert_l
a750: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
a760: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
a770: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
a780: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
a790: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a7a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a7b0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a7c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a7d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
a7e0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
a7f0: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
a800: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
a810: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a820: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
a830: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
a840: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
a850: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
a860: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
a870: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
a880: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
a890: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
a8a0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
a8b0: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
a8c0: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
a8d0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
a8e0: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
a8f0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
a900: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
a910: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
a920: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
a930: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a940: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
a950: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
a960: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
a970: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
a980: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
a990: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
a9a0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
a9b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
a9c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
a9d0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
a9e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
a9f0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
aa00: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aa10: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
aa20: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
aa30: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
aa40: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
aa50: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
aa60: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
aa70: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
aa80: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
aa90: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
aaa0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
aab0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
aac0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
aad0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
aae0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
aaf0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ab00: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
ab10: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
ab20: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
ab30: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
ab40: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
ab50: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
ab60: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
ab70: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
ab80: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
ab90: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
aba0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
abb0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
abc0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
abd0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
abe0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
abf0: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
ac00: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
ac10: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
ac20: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
ac30: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
ac40: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ac50: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
ac60: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
ac70: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
ac80: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
ac90: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
aca0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
acb0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
acc0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
acd0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
ace0: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63   */..Tls_Free((c
acf0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
ad00: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
ad10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ad20: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
ad30: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
ad40: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
ad50: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
ad60: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
ad70: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
ad80: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
ad90: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ada0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
adb0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
adc0: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
add0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ade0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
adf0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ae00: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ae10: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
ae20: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
ae30: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
ae40: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
ae50: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
ae60: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
ae70: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
ae80: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
ae90: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
aea0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
aeb0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
aec0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
aed0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
aee0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
aef0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
af00: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
af10: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
af20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
af30: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
af40: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
af50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
af60: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
af70: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
af80: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  on: ", REASON(),
af90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
afa0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
afb0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
afc0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
afd0: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22  "INIT", "FAILED"
afe0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
aff0: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ;..Tls_Free((cha
b000: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
b020: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
b030: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72   Set host server
b040: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20   name */.    if 
b050: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09  (servername) {..
b060: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76  /* Sets the serv
b070: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69  er name indicati
b080: 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65  on (SNI) in Clie
b090: 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f  ntHello extensio
b0a0: 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43  n */../* Per RFC
b0b0: 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20   6066, hostname 
b0c0: 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64  is a ASCII encod
b0d0: 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67  ed string, thoug
b0e0: 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20  h RFC 4366 says 
b0f0: 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21  UTF-8. */..if (!
b100: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68  SSL_set_tlsext_h
b110: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74  ost_name(statePt
b120: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
b130: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20  me) && require) 
b140: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b150: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b160: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73  "setting TLS hos
b170: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e  t name extension
b180: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b190: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b1a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b1b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b1c0: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
b1d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b1e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b1f0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b200: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b210: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b220: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68  R;..}.../* Set h
b230: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72  ostname for peer
b240: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73   certificate hos
b250: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69  tname verificati
b260: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09  on in clients...
b270: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c     Don't use SSL
b280: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65  _set1_host since
b290: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69   it has limitati
b2a0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
b2b0: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
b2c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b2d0: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
b2e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b2f0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
b300: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
b310: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
b320: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b330: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b340: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b350: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b360: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b370: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b380: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b390: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b3a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b3b0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b3c0: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b3d0: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b3e0: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b3f0: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b400: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b410: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b420: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b430: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b440: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b450: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b460: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b470: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
b480: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b490: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b4a0: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b4b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b4c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b4d0: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b4e0: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22  ", session_id, "
b4f0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b500: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b510: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b520: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b530: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b540: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b550: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b560: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
b570: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b580: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b590: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
b5a0: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41  .    /* Enable A
b5b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72  pplication-Layer
b5c0: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69   Protocol Negoti
b5d0: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20  ation. Examples 
b5e0: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09  are: http/1.0,..
b5f0: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
b600: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70  , ftp, imap, pop
b610: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20  3, xmpp-client, 
b620: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74  xmpp-server, mqt
b630: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a  t, irc, etc. */.
b640: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a      if (alpn) {.
b650: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43  ./* Convert a TC
b660: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72  L list into a pr
b670: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77  otocol-list in w
b680: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75  ire-format */..u
b690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
b6a0: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67  otos, *p;..unsig
b6b0: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c  ned int protos_l
b6c0: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a  en = 0;..Tcl_Siz
b6d0: 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a  e cnt, i;..int j
b6e0: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73  ;..Tcl_Obj **lis
b6f0: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73  t;...if (Tcl_Lis
b700: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
b710: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63  interp, alpn, &c
b720: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43  nt, &list) != TC
b730: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73  L_OK) {..    Tls
b740: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
b750: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b760: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b770: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
b780: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
b790: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
b7a0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
b7b0: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
b7c0: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
b7d0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
b7e0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
b7f0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
b800: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
b810: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b820: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
b830: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20  otocol name too 
b840: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20  long", (char *) 
b850: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74  NULL);...Tcl_Set
b860: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b870: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b880: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
b890: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b8a0: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
b8b0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
b8c0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  r);...return TCL
b8d0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
b8e0: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b      protos_len +
b8f0: 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b  = 1 + (int) len;
b900: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74  ..}.../* Build t
b910: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74  he complete prot
b920: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72  ocol-list */..pr
b930: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70  otos = ckalloc(p
b940: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20  rotos_len);../* 
b950: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63  protocol-lists c
b960: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20  onsist of 8-bit 
b970: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c  length-prefixed,
b980: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f   byte strings */
b990: 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20  ..for (j = 0, p 
b9a0: 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e  = protos; j < cn
b9b0: 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63  t; j++) {..    c
b9c0: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47  har *str = Tcl_G
b9d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
b9e0: 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a  list[j], &len);.
b9f0: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73  .    *p++ = (uns
ba00: 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b  igned char) len;
ba10: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ..    memcpy(p, 
ba20: 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  str, (size_t) le
ba30: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65  n);..    p += le
ba40: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73  n;..}.../* SSL_s
ba50: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d  et_alpn_protos m
ba60: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74  akes a copy of t
ba70: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  he protocol-list
ba80: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68   */../* Note: Th
ba90: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76  is functions rev
baa0: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e  erses the return
bab0: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f   value conventio
bac0: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65  n */..if (SSL_se
bad0: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74  t_alpn_protos(st
bae0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f  atePtr->ssl, pro
baf0: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29  tos, protos_len)
bb00: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
bb10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bb20: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74  , "failed to set
bb30: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22   ALPN protocols"
bb40: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bb50: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
bb60: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
bb70: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
bb80: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
bb90: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
bba0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
bbb0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
bbc0: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
bbd0: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
bbe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bbf0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
bc00: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
bc10: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bc20: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
bc30: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
bc40: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
bc50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
bc60: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
bc70: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
bc80: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
bc90: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
bca0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
bcb0: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
bcc0: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
bcd0: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
bce0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
bcf0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
bd00: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
bd10: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
bd20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
bd30: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
bd40: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73  back);.    SSL_s
bd50: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b  et_info_callback
bd60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bd70: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  InfoCallback);..
bd80: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
bd90: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72  for observing pr
bda0: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20  otocol messages 
bdb0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
bdc0: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
bdd0: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f      /* void SSL_
bde0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
bdf0: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74  back_arg(statePt
be00: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
be10: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76  statePtr);.    v
be20: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
be30: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
be40: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73  tePtr->ctx, Mess
be50: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f  ageCallback); */
be60: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67  .    SSL_set_msg
be70: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
be80: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
be90: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
bea0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
beb0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
bec0: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43  r->ssl, MessageC
bed0: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66  allback);.#endif
bee0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
bef0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20  Tcl_Channel BIO 
bf00: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73  Handler */.    s
bf10: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d  tatePtr->p_bio.=
bf20: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61   BIO_new_tcl(sta
bf30: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  tePtr, BIO_NOCLO
bf40: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  SE);.    statePt
bf50: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  r->bio.= BIO_new
bf60: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a  (BIO_f_ssl());..
bf70: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20      if (server) 
bf80: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c  {../* Server cal
bf90: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43  lbacks */..SSL_C
bfa0: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65  TX_set_tlsext_se
bfb0: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61  rvername_arg(sta
bfc0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
bfd0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
bfe0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
bff0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61  xt_servername_ca
c000: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
c010: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63  >ctx, SNICallbac
c020: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  k);..SSL_CTX_set
c030: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62  _client_hello_cb
c040: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c050: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  HelloCallback, (
c060: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c070: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  ;..if (statePtr-
c080: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
c090: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
c0a0: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f  set_alpn_select_
c0b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c0c0: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
c0d0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c0e0: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  );.#ifdef USE_NP
c0f0: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f  N..    if (tls1_
c100: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33  2 == 0 && tls1_3
c110: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43   == 0) {...SSL_C
c120: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c130: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62  os_advertised_cb
c140: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c150: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  NPNCallback, (vo
c160: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c170: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d  .    }.#endif..}
c180: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72  .../* Enable ser
c190: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74  ver to send cert
c1a0: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68   request after h
c1b0: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e  andshake (TLS 1.
c1c0: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41  3 only) */../* A
c1d0: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
c1e0: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65   must take place
c1f0: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69   for the Certifi
c200: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20  cate Request to 
c210: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74  be..   sent to t
c220: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20  he client, this 
c230: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68  can be done with
c240: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b   SSL_do_handshak
c250: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  e(). */..if (req
c260: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
c270: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33  dshake && tls1_3
c280: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72  ) {..    SSL_ver
c290: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f  ify_client_post_
c2a0: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50  handshake(stateP
c2b0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f  tr->ssl);..}.../
c2c0: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20  * set automatic 
c2d0: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20  curve selection 
c2e0: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68  */..SSL_set_ecdh
c2f0: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e  _auto(statePtr->
c300: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65  ssl, 1);.../* Se
c310: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
c320: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
c330: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
c340: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
c350: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
c360: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c370: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
c380: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
c390: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c3a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c3b0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
c3c0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c3d0: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
c3e0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
c3f0: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
c400: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c410: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c420: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c430: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
c440: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
c450: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
c460: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
c470: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
c480: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
c490: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
c4a0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
c4b0: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
c4c0: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
c4d0: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
c4e0: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
c4f0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
c500: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
c510: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
c520: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
c530: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
c540: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
c550: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c560: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
c570: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
c580: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
c590: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
c5a0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
c5b0: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
c5c0: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
c5d0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
c5e0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  l);.    }.    SS
c5f0: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50  L_set_bio(stateP
c600: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74  tr->ssl, statePt
c610: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50  r->p_bio, stateP
c620: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20  tr->p_bio);.    
c630: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74  BIO_set_ssl(stat
c640: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65  ePtr->bio, state
c650: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f  Ptr->ssl, BIO_NO
c660: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a  CLOSE);..    /*.
c670: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53       * End of SS
c680: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20  L Init.     */. 
c690: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
c6a0: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47  rning %s", Tcl_G
c6b0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
c6c0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
c6d0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c6e0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c6f0: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
c700: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
c710: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
c720: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ILE);..    retur
c730: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
c740: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
c750: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7a0: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
c7b0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
c7c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
c7d0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
c7e0: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
c7f0: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
c800: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
c810: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
c820: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
c830: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
c840: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
c850: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
c860: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
c8c0: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
c8d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c8e0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
c8f0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
c900: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
c910: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
c920: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
c930: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
c940: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
c950: 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70  e on. */..    dp
c960: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
c970: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
c980: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
c990: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c9a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
c9b0: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
c9c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
c9d0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
c9e0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
c9f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
ca00: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
ca10: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
ca20: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
ca30: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
ca40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ca50: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
ca60: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
ca70: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
ca80: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
ca90: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
caa0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
cab0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
cac0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
cad0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
cae0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
caf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cb00: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
cb10: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
cb20: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
cb30: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
cb40: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
cb50: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
cb60: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
cb70: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43  , "UNIMPORT", "C
cb80: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
cb90: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
cba0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
cbb0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
cbc0: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63    if (Tcl_Unstac
cbd0: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
cbe0: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52   chan) == TCL_ER
cbf0: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ROR) {..return T
cc00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cc10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cc20: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
cc30: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
cc40: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
cc90: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e   CTX_Init -- con
cca0: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58  struct a SSL_CTX
ccb0: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20   instance. *. * 
ccc0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61  Results:. *.A va
ccd0: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  lid SSL_CTX inst
cce0: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a  ance or NULL.. *
ccf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
cd00: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20  :. *.constructs 
cd10: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58  SSL context (CTX
cd20: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
cd70: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a  tatic SSL_CTX *.
cd80: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a  CTX_Init(State *
cd90: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73  statePtr, int is
cda0: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74  Server, int prot
cdb0: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65  o, char *keyfile
cdc0: 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65  , char *certfile
cdd0: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ,.    unsigned c
cde0: 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e  har *key, unsign
cdf0: 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69  ed char *cert, i
ce00: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20  nt key_len, int 
ce10: 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a  cert_len, char *
ce20: 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20  CAdir,.    char 
ce30: 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  *CAfile, char *c
ce40: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69  iphers, char *ci
ce50: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20  phersuites, int 
ce60: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70  level, char *DHp
ce70: 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c  arams) {.    Tcl
ce80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
ce90: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
cea0: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20  rp;.    SSL_CTX 
ceb0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ctx = NULL;.   
cec0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b   Tcl_DString ds;
ced0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
cee0: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66   ds1;.    int of
cef0: 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  f = 0;.    int l
cf00: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b  oad_private_key;
cf10: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
cf20: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
cf30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
cf40: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
cf50: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41  !proto) {..Tcl_A
cf60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
cf70: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72  rp, "no valid pr
cf80: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22  otocol selected"
cf90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
cfa0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
cfb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
cfc0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
cfd0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
cfe0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
cff0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
d000: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
d010: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d020: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
d030: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d040: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
d050: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
d060: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d070: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
d080: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d090: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d0a0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d0b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
d0c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d0d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d0e0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
d0f0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d100: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
d110: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
d120: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d130: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
d140: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d150: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d160: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d170: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d180: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
d190: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d1a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
d1b0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d1c0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
d1d0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
d1e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d1f0: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f  "TLS 1.0 protoco
d200: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d210: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d220: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d230: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d240: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d250: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
d260: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
d270: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d280: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d290: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
d2a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d2b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
d2c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d2d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d2e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d2f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d300: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d310: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
d320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d330: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
d340: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d350: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d360: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
d370: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d380: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
d390: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d3a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d3b0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d3c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d3d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d3e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
d3f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
d400: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d410: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d420: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
d430: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d440: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
d450: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d460: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d470: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d480: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d490: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f  ndif.    if (pro
d4a0: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55  to == 0) {../* U
d4b0: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f  se full range */
d4c0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
d4d0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
d4e0: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54  ctx, 0);..SSL_CT
d4f0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
d500: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
d520: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
d530: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
d540: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
d550: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
d560: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
d570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d580: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
d590: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
d5a0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d5b0: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
d5c0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
d5d0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
d5e0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d5f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d600: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
d610: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d620: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
d630: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
d640: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
d650: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
d660: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
d670: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
d680: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d690: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
d6a0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d6b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d6c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
d6d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d6e0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
d6f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d700: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
d710: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d720: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
d730: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
d740: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
d750: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
d760: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d770: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d780: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d790: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d7a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
d7b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d7c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
d7d0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
d7e0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
d7f0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d800: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
d810: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d820: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
d830: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d840: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d850: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d860: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d870: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
d880: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d890: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
d8a0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
d8b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
d8c0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d8d0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
d8e0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
d8f0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
d900: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d910: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d920: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
d930: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d940: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
d950: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d960: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
d970: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
d980: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
d990: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
d9a0: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
d9b0: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
d9c0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
d9d0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d9e0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
d9f0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
da00: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
da10: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
da20: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
da30: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
da40: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
da50: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
da60: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
da70: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
da80: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
da90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
daa0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
dab0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
dac0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
dad0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
dae0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
daf0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
db00: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
db10: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
db20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
db30: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
db40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
db50: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
db60: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
db70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
db80: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
db90: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
dba0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
dbb0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
dbc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dbd0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
dbe0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dbf0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
dc00: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
dc10: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
dc20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dc30: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
dc40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc50: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
dc60: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dc70: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
dc80: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
dc90: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
dca0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
dcb0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
dcc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dcd0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
dce0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
dcf0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
dd00: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
dd10: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
dd20: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
dd30: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
dd40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
dd50: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
dd60: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
dd70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
dd80: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
dd90: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
dda0: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
ddb0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
ddc0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
ddd0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
dde0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
ddf0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
de00: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20  turn(NULL);.    
de10: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e  }..    if (geten
de20: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
de30: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
de40: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b  _keylog_callback
de50: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c  (ctx, KeyLogCall
de60: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  back);.    }..#i
de70: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
de80: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
de90: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dea0: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
deb0: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
dec0: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43  TLS1_3) {..SSL_C
ded0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
dee0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
def0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
df00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
df10: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
df20: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
df30: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
df40: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63  ..    /* Force c
df50: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20  ipher selection 
df60: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20  order by server 
df70: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  */.    if (!isSe
df80: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
df90: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
dfa0: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
dfb0: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
dfc0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f  E);.    }..#if O
dfd0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
dfe0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
dff0: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f  00L.    OpenSSL_
e000: 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68  add_all_algorith
e010: 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69  ms(); /* Load ci
e020: 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74  phers and digest
e030: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  s */.#endif..   
e040: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70   SSL_CTX_set_app
e050: 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  _data(ctx, (void
e060: 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65  *)interp);./* re
e070: 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72  member the inter
e080: 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53  preter */.    SS
e090: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
e0a0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c  s(ctx, SSL_OP_AL
e0b0: 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62  L);./* all SSL b
e0c0: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a  ug workarounds *
e0d0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
e0e0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
e0f0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53  SL_OP_NO_COMPRES
e100: 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c  SION);./* disabl
e110: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76  e compression ev
e120: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20  en if supported 
e130: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
e140: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
e150: 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c  off);../* disabl
e160: 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69  e protocol versi
e170: 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ons */.#if OPENS
e180: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
e190: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a  R < 0x10101000L.
e1a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e1b0: 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f  mode(ctx, SSL_MO
e1c0: 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09  DE_AUTO_RETRY);.
e1d0: 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61  /* handle new ha
e1e0: 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b  ndshakes in back
e1f0: 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65  ground. On by de
e200: 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c  fault in OpenSSL
e210: 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69   1.1.1. */.#endi
e220: 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  f.    SSL_CTX_se
e230: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a  ss_set_cache_siz
e240: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20  e(ctx, 128);..  
e250: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65    /* Set user de
e260: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63  fined ciphers, c
e270: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e  ipher suites, an
e280: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  d security level
e290: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70   */.    if ((cip
e2a0: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  hers != NULL) &&
e2b0: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
e2c0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63  pher_list(ctx, c
e2d0: 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f  iphers)) {..Tcl_
e2e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e2f0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
e300: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e310: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e320: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e330: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e340: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e350: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69     }.    if ((ci
e360: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55  phersuites != NU
e370: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
e380: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73  set_ciphersuites
e390: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74  (ctx, ciphersuit
e3a0: 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  es)) {..Tcl_Appe
e3b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e3c0: 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69   "Set cipher sui
e3d0: 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76  tes failed: No v
e3e0: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28  alid ciphers", (
e3f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e400: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e410: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e420: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
e430: 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65  et security leve
e440: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76  l */.    if (lev
e450: 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c  el > -1 && level
e460: 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f   < 6) {../* SSL_
e470: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  set_security_lev
e480: 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  el */..SSL_CTX_s
e490: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
e4a0: 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20  l(ctx, level);. 
e4b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74     }..    /* set
e4c0: 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20   some callbacks 
e4d0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
e4e0: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77  et_default_passw
e4f0: 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f  d_cb(ctx, Passwo
e500: 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  rdCallback);.   
e510: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
e520: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75  ault_passwd_cb_u
e530: 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f  serdata(ctx, (vo
e540: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
e550: 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44  .    /* read a D
e560: 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61  iffie-Hellman pa
e570: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f  rameters file, o
e580: 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d  r use the built-
e590: 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66  in one */.#ifdef
e5a0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20   OPENSSL_NO_DH. 
e5b0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20     if (DHparams 
e5c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
e5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e5e0: 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74  erp, "DH paramet
e5f0: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61  er support not a
e600: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72  vailable", (char
e610: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e620: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e630: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e640: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09   }.#else.    {..
e650: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70  DH* dh;..if (DHp
e660: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
e670: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ..    BIO *bio;.
e680: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
e690: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20  Init(&ds);..    
e6a0: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69  bio = BIO_new_fi
e6b0: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c  le(F2N(DHparams,
e6c0: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20   &ds), "r");..  
e6d0: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09    if (!bio) {...
e6e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e6f0: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  &ds);...Tcl_Appe
e700: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e710: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64   "Could not find
e720: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66   DH parameters f
e730: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ile", (char *) N
e740: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e750: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e760: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e770: 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f  ...    dh = PEM_
e780: 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d  read_bio_DHparam
e790: 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  s(bio, NULL, NUL
e7a0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42  L, NULL);..    B
e7b0: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20  IO_free(bio);.. 
e7c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
e7d0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66  ee(&ds);..    if
e7e0: 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41   (!dh) {...Tcl_A
e7f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e800: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72  rp, "Could not r
e810: 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72  ead DH parameter
e820: 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63  s from file", (c
e830: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
e840: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e850: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
e860: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53  ;..    }..    SS
e870: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68  L_CTX_set_tmp_dh
e880: 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20  (ctx, dh);..    
e890: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d  DH_free(dh);...}
e8a0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20   else {..    /* 
e8b0: 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44  Use well known D
e8c0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  H parameters tha
e8d0: 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20  t have built-in 
e8e0: 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53  support in OpenS
e8f0: 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21  SL */..    if (!
e900: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61  SSL_CTX_set_dh_a
e910: 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09  uto(ctx, 1)) {..
e920: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e930: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
e940: 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20   not enable set 
e950: 44 48 20 61 75 74 6f 3a 20 22 2c 20 52 45 41 53  DH auto: ", REAS
e960: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
e970: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e980: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e990: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e9a0: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
e9b0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
e9c0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
e9d0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
e9e0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
e9f0: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
ea00: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
ea10: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54  ate_key = 1;...T
ea20: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
ea30: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  ds);...if (SSL_C
ea40: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
ea50: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  te_file(ctx, F2N
ea60: 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c  (certfile, &ds),
ea70: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
ea80: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  M) <= 0) {..    
ea90: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
eaa0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
eab0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
eac0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
ead0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
eae0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
eaf0: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
eb00: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
eb10: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
eb20: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
eb30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
eb40: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
eb50: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
eb60: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
eb70: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
eb80: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
eb90: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
eba0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72  x, cert_len, cer
ebb0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  t) <= 0) {..    
ebc0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ebd0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
ebe0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ebf0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
ec00: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
ec10: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
ec20: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ec30: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
ec40: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
ec50: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
ec60: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
ec70: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
ec80: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
ec90: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
eca0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
ecb0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
ecc0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
ecd0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
ece0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
ecf0: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  0..    Tcl_DStri
ed00: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
ed10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ed20: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
ed30: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
ed40: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
ed50: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
ed60: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45  ": ",....     RE
ed70: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ed80: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
ed90: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
eda0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
edb0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20  ;.#endif..}.    
edc0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  }..    /* set ou
edd0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f  r private key */
ede0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72  .    if (load_pr
edf0: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66  ivate_key) {..if
ee00: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
ee10: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c  L && key == NULL
ee20: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65  ) {..    keyfile
ee30: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a   = certfile;..}.
ee40: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d  ..if (keyfile !=
ee50: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
ee60: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65   get the private
ee70: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
ee80: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66  with this certif
ee90: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66  icate */..    if
eea0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
eeb0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d  L) {...keyfile =
eec0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20   certfile;..    
eed0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  }...    if (SSL_
eee0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
eef0: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  ey_file(ctx, F2N
ef00: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20  (keyfile, &ds), 
ef10: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
ef20: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
ef30: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ef40: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
ef50: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
ef60: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
ef70: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
ef80: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
ef90: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
efa0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
efb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
efc0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
efd0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
efe0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
eff0: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20  , " ",....      
f000: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
f010: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
f020: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f030: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f040: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
f050: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f060: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
f070: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key != NULL) {..
f080: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
f090: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41  use_PrivateKey_A
f0a0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41  SN1(EVP_PKEY_RSA
f0b0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c  , ctx, key,key_l
f0c0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  en) <= 0) {...Tc
f0d0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f0e0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
f0f0: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
f100: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
f110: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
f120: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
f130: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
f140: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
f150: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f160: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
f170: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
f180: 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ey: ", REASON(),
f190: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f1a0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
f1b0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
f1c0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
f1d0: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
f1e0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
f1f0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
f200: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
f210: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
f220: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
f230: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
f240: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
f250: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f260: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
f270: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
f280: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
f290: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
f2a0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
f2b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
f2c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f2d0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
f2e0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
f2f0: 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69  * Set verificati
f300: 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63  on CAs */.    Tc
f310: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
f320: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
f330: 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20  ingInit(&ds1);. 
f340: 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f     /* There is o
f350: 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  ne default direc
f360: 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c  tory, one defaul
f370: 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20  t file, and one 
f380: 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09  default store...
f390: 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63  The default CA c
f3a0: 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65  ertificates dire
f3b0: 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75  ctory (and defau
f3c0: 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20  lt store) is in 
f3d0: 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72  the OpenSSL..cer
f3e0: 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74  ts directory. It
f3f0: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
f400: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
f410: 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20  RT_DIR env var. 
f420: 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20  The..default CA 
f430: 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c  certificates fil
f440: 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74  e is called cert
f450: 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61  .pem in the defa
f460: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72  ult OpenSSL..dir
f470: 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62  ectory. It can b
f480: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
f490: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c  the SSL_CERT_FIL
f4a0: 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f  E env var. */../
f4b0: 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65  * int SSL_CTX_se
f4c0: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79  t_default_verify
f4d0: 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74  _dir(SSL_CTX *ct
f4e0: 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43  x) and int SSL_C
f4f0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
f500: 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43  erify_file(SSL_C
f510: 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20  TX *ctx) */.    
f520: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
f530: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f  d_verify_locatio
f540: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69  ns(ctx, F2N(CAfi
f550: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41  le, &ds), F2N(CA
f560: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09  dir, &ds1)) ||..
f570: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
f580: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
f590: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a  s(ctx)) {.#if 0.
f5a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
f5b0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72  (&ds);..Tcl_DStr
f5c0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09  ingFree(&ds1);..
f5d0: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74  /* Don't current
f5e0: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20  ly care if this 
f5f0: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70  fails */..Tcl_Ap
f600: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f610: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20  p, "SSL default 
f620: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c  verify paths: ",
f630: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
f640: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
f650: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f660: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e  return NULL;.#en
f670: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
f680: 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65  * https://source
f690: 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f  forge.net/p/tls/
f6a0: 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20  bugs/57/ */.    
f6b0: 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74  /* XXX:TODO: Let
f6c0: 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79   the user supply
f6d0: 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73   values here ins
f6e0: 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e  tead of somethin
f6f0: 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e  g that exists on
f700: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
f710: 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  */.    if (CAfil
f720: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54  e != NULL) {..ST
f730: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
f740: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
f750: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
f760: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
f770: 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63  e, &ds));..if (c
f780: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
f790: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ) {..    SSL_CTX
f7a0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _set_client_CA_l
f7b0: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d  ist(ctx, certNam
f7c0: 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  es);..}.    }.. 
f7d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f7e0: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c  ee(&ds);.    Tcl
f7f0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f800: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63  1);.    return c
f810: 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tx;.}.../*. *---
f820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f860: 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a  . *. * StatusObj
f870: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65  Cmd -- return ce
f880: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f  rtificate for co
f890: 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a  nnected peer.. *
f8a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
f8b0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
f8c0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
f8d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
f8e0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
f930: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74  .static int.Stat
f940: 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  usObjCmd(ClientD
f950: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
f960: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f970: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
f980: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
f990: 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65  v[]) {.    State
f9a0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
f9b0: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20  X509 *peer;.    
f9c0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
f9d0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
f9e0: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20   chan;.    char 
f9f0: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63  *channelName, *c
fa00: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20  iphers;.    int 
fa10: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  mode;.    const 
fa20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
fa30: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  roto;.    unsign
fa40: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20  ed int len;.    
fa50: 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20  int nid, res;.. 
fa60: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
fa70: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
fa80: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20  bjc < 2 || objc 
fa90: 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20  > 3 || (objc == 
faa0: 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c  3 && !strcmp(Tcl
fab0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fac0: 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29  1]), "-local")))
fad0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
fae0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
faf0: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20  objv, "?-local? 
fb00: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
fb10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fb20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
fb30: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20  channel Id */.  
fb40: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20    channelName = 
fb50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
fb60: 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20  mObj(objv[(objc 
fb70: 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20  == 2 ? 1 : 2)], 
fb80: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c  (Tcl_Size *) NUL
fb90: 4c 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  L);.    chan = T
fba0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
fbb0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  terp, channelNam
fbc0: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  e, &mode);.    i
fbd0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
fbe0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
fbf0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
fc00: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
fc10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
fc20: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
fc30: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
fc40: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
fc50: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
fc60: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
fc70: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
fc80: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
fc90: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
fca0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fcb0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
fcc0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
fcd0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
fce0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
fcf0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
fd00: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
fd10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
fd20: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c  "TLS", "STATUS",
fd30: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
fd40: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
fd50: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
fd60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fd70: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
fd80: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
fd90: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
fda0: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
fdb0: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
fdc0: 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73  te for peer or s
fdd0: 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  elf */.    if (o
fde0: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
fdf0: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
fe00: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
fe10: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fe20: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
fe30: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
fe40: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
fe50: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
fe60: 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74  /* Get X509 cert
fe70: 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a  ificate info */.
fe80: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
fe90: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
fea0: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
feb0: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
fec0: 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58  c == 2) {..    X
fed0: 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a  509_free(peer);.
fee0: 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c  .    peer = NULL
fef0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
ff00: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
ff10: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
ff20: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
ff30: 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a  /* Peer name */.
ff40: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
ff50: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ff60: 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  "peername", SSL_
ff70: 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
ff80: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
ff90: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
ffa0: 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
ffb0: 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f  r, "sbits", SSL_
ffc0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
ffd0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
ffe0: 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  ULL));..    ciph
fff0: 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
10000 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
10010 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10020 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
10040 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d  her", ciphers, -
10050 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  1);..    /* Veri
10060 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74  fy the X509 cert
10070 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65  ificate presente
10080 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f  d by the peer */
10090 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
100a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
100b0 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c   "verifyResult",
100c0 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  ..X509_verify_ce
100d0 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
100e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
100f0 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
10100 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  ssl)), -1);..   
10110 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
10120 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
10130 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
10140 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
10150 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
10160 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  & SSL_VERIFY_NON
10170 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  E) {..LAPPEND_ST
10180 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10190 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
101a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
101b0 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
101c0 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d  bj *listObjPtr =
101d0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
101e0 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d  0, NULL);..if (m
101f0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
10200 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54  Y_PEER) {..    T
10210 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10220 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10230 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
10240 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65  NewStringObj("pe
10250 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  er", -1));..}..i
10260 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
10270 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
10280 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20  _PEER_CERT) {.. 
10290 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
102a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
102b0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
102c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
102d0 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65  ("fail if no pee
102e0 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09  r cert", -1));..
102f0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10300 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
10310 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63  _ONCE) {..    Tc
10320 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10330 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10340 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10350 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69  ewStringObj("cli
10360 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b  ent once", -1));
10370 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
10380 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
10390 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20  _HANDSHAKE) {.. 
103a0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
103b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
103c0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
103d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
103e0 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65  ("post handshake
103f0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50  ", -1));..}..LAP
10400 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
10410 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
10420 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74  Mode", listObjPt
10430 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r).    }..    /*
10440 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70   Verify mode dep
10450 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  th */.    LAPPEN
10460 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10470 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70  jPtr, "verifyDep
10480 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  th", SSL_get_ver
10490 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50  ify_depth(stateP
104a0 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20  tr->ssl));..    
104b0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
104c0 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
104d0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
104e0 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  he negotiation *
104f0 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61  /.    SSL_get0_a
10500 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
10510 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
10520 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c  to, &len);.    L
10530 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10540 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e  p, objPtr, "alpn
10550 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  ", (char *)proto
10560 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
10570 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
10580 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10590 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53  r, "protocol", S
105a0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
105b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
105c0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69  1);..    /* Vali
105d0 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69  d for non-RSA si
105e0 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20  gnature and TLS 
105f0 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  1.3 */.    if (o
10600 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73  bjc == 2) {..res
10610 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
10620 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
10630 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10640 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
10650 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
10660 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
10670 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10680 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
10690 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
106a0 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
106b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
106c0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73  r, "signatureHas
106d0 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a  hAlgorithm", OBJ
106e0 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
106f0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
10700 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20   == 2) {..res = 
10710 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
10720 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
10730 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10740 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  nid);.    } else
10750 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
10760 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  t_signature_type
10770 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10780 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
10790 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
107a0 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41  nid = 0;}.    LA
107b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
107c0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61  , objPtr, "signa
107d0 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e  tureType", OBJ_n
107e0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
107f0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
10800 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
10810 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
10820 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
10830 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
10840 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
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 2d 2d 2d 2d 2d  ----------------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69  -. *. * Connecti
108a0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20  onInfoObjCmd -- 
108b0 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f  return connectio
108c0 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e  n info from Open
108d0 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  SSL.. *. * Resul
108e0 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66  ts:. *.A list of
108f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10900 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  *. *---------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
10950 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65  static int Conne
10960 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28  ctionInfoObjCmd(
10970 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
10980 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
10990 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
109a0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
109b0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
109c0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
109d0 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
109e0 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
109f0 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74  e on */.    Stat
10a00 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
10a10 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
10a20 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
10a30 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
10a40 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20  Ptr, *listPtr;. 
10a50 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
10a60 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
10a70 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
10a80 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
10a90 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
10aa0 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
10ab0 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28  D *md;..    if (
10ac0 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
10ad0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10ae0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10af0 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
10b00 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
10b10 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
10b20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
10b30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10b40 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10b50 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65  jv[1], (Tcl_Size
10b60 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b   *)NULL), NULL);
10b70 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
10b80 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
10b90 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54  ULL) {..return(T
10ba0 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
10bb0 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
10bc0 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
10bd0 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
10be0 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
10bf0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
10c00 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
10c10 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
10c20 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
10c30 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
10c40 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
10c50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10c60 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
10c70 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
10c80 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
10c90 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
10ca0 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
10cb0 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
10cc0 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
10cd0 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
10ce0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
10cf0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
10d00 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  LL);..return(TCL
10d10 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
10d20 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
10d30 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
10d40 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  ULL);..    /* Co
10d50 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f  nnection info */
10d60 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
10d70 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
10d80 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
10d90 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73  ata(chan);.    s
10da0 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73  sl = statePtr->s
10db0 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  sl;.    if (ssl 
10dc0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63  != NULL) {../* c
10dd0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20  onnection state 
10de0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
10df0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10e00 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61  "state", SSL_sta
10e10 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
10e20 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47  sl), -1);.../* G
10e30 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64  et SNI requested
10e40 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
10e50 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10e60 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
10e70 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67  rvername", SSL_g
10e80 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
10e90 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
10ea0 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d  PE_host_name), -
10eb0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f  1);.../* Get pro
10ec0 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  tocol */..LAPPEN
10ed0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10ee0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
10ef0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
10f00 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f  n(ssl), -1);.../
10f10 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20  * Renegotiation 
10f20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50  allowed */..LAPP
10f30 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
10f40 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f   objPtr, "renego
10f50 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22  tiation_allowed"
10f60 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65  , SSL_get_secure
10f70 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73  _renegotiation_s
10f80 75 70 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09  upport(ssl));...
10f90 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20  /* Get security 
10fa0 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  level */..LAPPEN
10fb0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10fc0 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f  jPtr, "security_
10fd0 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  level", SSL_get_
10fe0 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73  security_level(s
10ff0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  sl));.../* Sessi
11000 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  on info */..LAPP
11010 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11020 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
11030 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73  n_reused", SSL_s
11040 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
11050 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  l));.../* Is ser
11060 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ver info */..LAP
11070 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11080 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65  , objPtr, "is_se
11090 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65  rver", SSL_is_se
110a0 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  rver(ssl));.../*
110b0 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50   Is DTLS */..LAP
110c0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
110d0 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74  , objPtr, "is_dt
110e0 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73  ls", SSL_is_dtls
110f0 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  (ssl));.    }.. 
11100 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66     /* Cipher inf
11110 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20  o */.    cipher 
11120 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
11130 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20  t_cipher(ssl);. 
11140 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d     if (cipher !=
11150 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
11160 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d  uf[BUFSIZ] = {0}
11170 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67  ;..int bits, alg
11180 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68  _bits;.../* Ciph
11190 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
111a0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
111b0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
111c0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
111d0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
111e0 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d  1);.../* RFC nam
111f0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
11200 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
11220 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c  ndard_name", SSL
11230 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
11240 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
11250 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c  1);.../* OpenSSL
11260 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
11270 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11280 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11290 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20  "openssl_name", 
112a0 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e  OPENSSL_cipher_n
112b0 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73  ame(SSL_CIPHER_s
112c0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
112d0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
112e0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65   number of secre
112f0 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20  t bits used for 
11300 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20  cipher */..bits 
11310 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  = SSL_CIPHER_get
11320 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61  _bits(cipher, &a
11330 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  lg_bits);..LAPPE
11340 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11350 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62  bjPtr, "secret_b
11360 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41  its", bits);..LA
11370 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11380 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72  , objPtr, "algor
11390 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f  ithm_bits", alg_
113a0 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  bits);../* alg_b
113b0 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
113c0 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
113d0 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
113e0 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
113f0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
11400 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
11410 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
11420 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
11430 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
11440 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
11450 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73  /.../* Indicates
11460 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70   which SSL/TLS p
11470 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20  rotocol version 
11480 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68  first defined th
11490 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  e cipher */..LAP
114a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
114b0 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65   objPtr, "min_ve
114c0 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48  rsion", SSL_CIPH
114d0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
114e0 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
114f0 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a  * Cipher NID */.
11500 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11510 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
11520 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20  pherNID", (char 
11530 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
11540 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68  _CIPHER_get_ciph
11550 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  er_nid(cipher)),
11560 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11570 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11580 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20  r, "digestNID", 
11590 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
115a0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
115b0 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70  t_digest_nid(cip
115c0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
115d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
115e0 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63   objPtr, "keyExc
115f0 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72  hangeNID", (char
11600 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
11610 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f  L_CIPHER_get_kx_
11620 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11630 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11640 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11650 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e  "authenticationN
11660 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
11670 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
11680 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28  ER_get_auth_nid(
11690 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
116a0 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68  ./* message auth
116b0 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
116c0 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44  - Cipher is AEAD
116d0 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68   (e.g. GCM or Ch
116e0 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29  aCha20/Poly1305)
116f0 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41   or not */../* A
11700 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63  uthenticated Enc
11710 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73  ryption with ass
11720 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45  ociated data (AE
11730 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41  AD) check */..LA
11740 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11750 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11760 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c  er_is_aead", SSL
11770 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28  _CIPHER_is_aead(
11780 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44  cipher));.../* D
11790 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e  igest used durin
117a0 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61  g the SSL/TLS ha
117b0 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69  ndshake when usi
117c0 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a  ng the cipher. *
117d0 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48  /..md = SSL_CIPH
117e0 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65  ER_get_handshake
117f0 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b  _digest(cipher);
11800 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11810 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68  terp, objPtr, "h
11820 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22  andshake_digest"
11830 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44  , (char *)EVP_MD
11840 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a  _name(md), -1);.
11850 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c  ../* Get OpenSSL
11860 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f  -specific ID, no
11870 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41  t IANA ID */..LA
11880 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11890 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
118a0 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  r_id", (int) SSL
118b0 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
118c0 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77  ipher));.../* Tw
118d0 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69  o-byte ID used i
118e0 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63  n the TLS protoc
118f0 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ol of the given 
11900 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11910 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11920 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
11930 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
11940 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f  CIPHER_get_proto
11950 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b  col_id(cipher));
11960 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65  .../* Textual de
11970 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
11980 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28   cipher */..if (
11990 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
119a0 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62  iption(cipher, b
119b0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
119c0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
119d0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
119e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65  erp, objPtr, "de
119f0 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c  scription", buf,
11a00 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a   -1);..}.    }..
11a10 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
11a20 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
11a30 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
11a40 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
11a50 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
11a60 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
11a70 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
11a80 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
11a90 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
11aa0 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
11ab0 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
11ac0 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a  ion_id, *proto;.
11ad0 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c  .char buffer[SSL
11ae0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
11af0 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
11b00 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
11b10 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
11b20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
11b30 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
11b40 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
11b50 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
11b60 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
11b70 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
11b80 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11b90 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
11ba0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
11bb0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
11bc0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
11bd0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
11be0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
11bf0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
11c00 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
11c10 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
11c20 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
11c30 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
11c40 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
11c50 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11c60 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
11c70 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
11c80 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
11c90 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
11ca0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
11cb0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
11cc0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
11cd0 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
11ce0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
11cf0 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
11d00 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
11d10 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
11d20 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
11d30 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
11d40 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
11d50 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
11d60 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
11d70 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
11d80 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
11d90 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
11da0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
11db0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
11dc0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
11dd0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
11de0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
11df0 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
11e00 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
11e10 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
11e20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
11e30 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
11e40 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
11e50 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
11e60 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
11e70 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
11e80 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
11e90 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
11ea0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
11eb0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
11ec0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
11ed0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
11ee0 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
11ef0 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
11f00 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
11f10 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
11f20 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
11f30 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
11f40 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
11f50 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
11f60 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
11f70 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
11f80 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
11f90 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
11fa0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
11fb0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
11fc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
11fd0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
11fe0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
11ff0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
12000 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
12010 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
12020 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12030 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12040 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
12050 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
12060 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
12070 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
12080 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
12090 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c  app data */..SSL
120a0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
120b0 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73  cket_appdata(ses
120c0 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
120d0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
120e0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
120f0 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61  bjPtr, "ticket_a
12100 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74  pp_data", ticket
12110 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
12120 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  2);.../* Get mas
12130 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
12140 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12150 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
12160 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
12170 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
12180 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
12190 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
121a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
121b0 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
121c0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
121d0 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
121e0 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
121f0 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
12200 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
12210 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
12220 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12230 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12240 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
12250 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
12260 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
12270 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12280 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
12290 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
122a0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
122b0 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
122c0 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
122d0 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
122e0 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
122f0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12300 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
12310 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
12320 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
12330 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
12340 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12350 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
12360 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
12370 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
12380 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
12390 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
123a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
123b0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
123c0 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
123d0 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
123e0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
123f0 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
12400 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12410 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
12420 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
12430 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12440 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
12450 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
12460 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
12470 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
12480 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
12490 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
124a0 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
124b0 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
124c0 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
124d0 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
124e0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
124f0 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
12500 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
12510 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
12520 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
12530 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
12540 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
12550 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12560 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
12570 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
12580 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
12590 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
125a0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
125b0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
125c0 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
125d0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
125e0 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
125f0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12600 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12610 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
12620 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
12630 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
12640 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
12650 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
12660 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
12670 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
12680 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
12690 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
126a0 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
126b0 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
126c0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
126d0 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
126e0 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
126f0 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
12700 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
12710 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
12720 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
12730 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
12740 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ];..for (int i =
12750 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f   0; i < sk_X509_
12760 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
12770 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
12780 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d  509_NAME *name =
12790 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61   sk_X509_NAME_va
127a0 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b  lue(ca_list, i);
127b0 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20  ..    if (name) 
127c0 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e  {...X509_NAME_on
127d0 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66  eline(name, buff
127e0 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54  er, BUFSIZ);...T
127f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12800 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12810 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
12820 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
12830 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09  , -1));..    }..
12840 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50  }.    }.    LAPP
12850 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
12860 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22  objPtr, "caList"
12870 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20  , listPtr);.    
12880 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
12890 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
128a0 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35  istCount", sk_X5
128b0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c  09_NAME_num(ca_l
128c0 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ist));..    Tcl_
128d0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
128e0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
128f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12900 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
12910 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
12920 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12960 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
12970 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72  rsionObjCmd -- r
12980 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74  eturn version st
12990 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53  ring from OpenSS
129a0 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
129b0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
129c0 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
129d0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
129e0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a30 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
12a40 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43  .VersionObjCmd(C
12a50 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
12a60 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
12a70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
12a80 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
12a90 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
12aa0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
12ab0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
12ac0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f  Called");..    o
12ad0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
12ae0 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c  tringObj(OPENSSL
12af0 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d  _VERSION_TEXT, -
12b00 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  1);.    Tcl_SetO
12b10 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12b20 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72   objPtr);..    r
12b30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
12b40 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
12b50 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20  ntData;..objc = 
12b60 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62  objc;..objv = ob
12b70 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  jv;.}.../*. *---
12b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bc0 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d  . *. * MiscObjCm
12bd0 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e  d -- misc comman
12be0 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ds. *. * Results
12bf0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
12c00 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
12c10 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
12c20 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c70 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
12c80 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65  .MiscObjCmd(Clie
12c90 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
12ca0 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
12cb0 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
12cc0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
12cd0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74  objv[]) {.    st
12ce0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
12cf0 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b  *commands [] = {
12d00 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22   "req", "strreq"
12d10 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e  , NULL };.    en
12d20 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52  um command { C_R
12d30 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f  EQ, C_STRREQ, C_
12d40 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c  DUMMY };.    Tcl
12d50 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69  _Size cmd;.    i
12d60 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68  nt isStr;.    ch
12d70 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d  ar buffer[16384]
12d80 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
12d90 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
12da0 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
12db0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12dc0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
12dd0 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
12de0 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
12df0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12e00 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
12e10 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
12e20 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
12e30 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
12e40 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54  ", 0, &cmd) != T
12e50 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
12e60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12e70 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
12e80 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
12e90 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
12ea0 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
12eb0 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
12ec0 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
12ed0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
12ee0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
12ef0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
12f00 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
12f10 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
12f20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
12f30 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
12f40 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
12f50 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b   Tcl_Size listc;
12f60 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20  ..    int i;... 
12f70 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
12f80 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
12f90 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
12fa0 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
12fb0 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
12fc0 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
12fd0 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
12fe0 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
12ff0 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
13000 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
13010 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13020 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13030 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13040 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
13050 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
13060 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
13070 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
13080 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
13090 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
130a0 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
130b0 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
130c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
130d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
130e0 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
130f0 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
13100 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13110 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
13120 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
13130 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13140 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
13150 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13160 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13170 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
13180 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
13190 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
131a0 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
131b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
131c0 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
131d0 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
131e0 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
131f0 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
13200 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
13210 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
13220 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
13230 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
13240 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
13250 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
13260 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  , &listc, &listv
13270 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13280 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13290 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
132a0 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
132b0 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
132c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
132d0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
132e0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
132f0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13300 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
13310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13320 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
13330 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
13340 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
13350 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13360 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
13370 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
13380 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
13390 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
133a0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
133b0 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
133c0 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
133d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
133e0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
133f0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
13400 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
13410 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13420 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
13430 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
13440 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
13450 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13460 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13470 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
13480 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
13490 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
134a0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
134b0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
134c0 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
134d0 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
134e0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
134f0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13500 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13510 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
13520 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
13530 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13540 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13550 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
13560 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
13570 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13580 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13590 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
135a0 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
135b0 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
135c0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
135d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
135e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
135f0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
13600 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
13610 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13620 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13630 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
13640 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
13650 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
13660 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13670 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
13680 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
13690 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
136a0 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
136b0 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
136c0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
136d0 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
136e0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
136f0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13700 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
13710 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
13720 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
13730 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
13740 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
13750 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
13760 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
13770 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13780 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
13790 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
137a0 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
137b0 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
137c0 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
137d0 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
137e0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
137f0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13800 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
13810 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
13820 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
13830 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
13840 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
13850 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
13860 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
13870 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
13880 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
13890 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
138a0 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
138b0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
138c0 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
138d0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
138e0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
138f0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
13900 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
13910 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
13920 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
13930 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
13940 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13950 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
13960 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
13970 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
13980 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13990 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
139a0 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
139b0 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
139c0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
139d0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
139e0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
139f0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
13a00 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
13a10 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
13a20 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
13a30 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
13a40 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
13a50 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
13a60 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
13a70 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
13a80 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
13a90 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
13aa0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
13ab0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
13ac0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
13ad0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
13ae0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
13af0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
13b00 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
13b10 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
13b20 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
13b30 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
13b40 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
13b50 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
13b60 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
13b70 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
13b80 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
13b90 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
13ba0 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
13bb0 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
13bc0 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
13bd0 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
13be0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
13bf0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
13c00 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
13c10 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
13c20 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
13c30 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
13c40 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
13c50 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
13c60 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
13c70 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
13c80 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13c90 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13ca0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
13cb0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
13cc0 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
13cd0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09  _ERROR);...}....
13ce0 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
13cf0 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
13d00 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
13d10 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
13d20 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
13d30 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
13d40 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
13d50 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29  tBefore(cert),0)
13d60 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
13d70 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
13d80 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f  tAfter(cert),(lo
13d90 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73  ng)60*60*24*days
13da0 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75  );...X509_set_pu
13db0 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b  bkey(cert,pkey);
13dc0 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65  ....name=X509_ge
13dd0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
13de0 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41  ert);....X509_NA
13df0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
13e00 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42  txt(name,"C", MB
13e10 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
13e20 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13e30 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c   *) k_C, -1, -1,
13e40 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
13e50 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
13e60 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53  t(name,"ST", MBS
13e70 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13e80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13e90 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
13ea0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
13eb0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
13ec0 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
13ed0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
13ee0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13ef0 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_L, -1, -1, 0
13f00 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
13f10 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
13f20 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49  name,"O", MBSTRI
13f30 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
13f40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
13f50 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_O, -1, -1, 0);
13f60 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
13f70 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
13f80 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e  me,"OU", MBSTRIN
13f90 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13fa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13fb0 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
13fc0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
13fd0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
13fe0 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
13ff0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14010 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _CN, -1, -1, 0);
14020 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14030 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14040 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54  me,"Email", MBST
14050 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14060 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14070 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
14080 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
14090 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
140a0 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
140b0 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
140c0 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32  rt,pkey,EVP_sha2
140d0 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58  56())) {...    X
140e0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
140f0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
14100 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
14110 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
14120 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
14130 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
14140 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
14150 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
14160 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
14170 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69   signing certifi
14180 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  cate",NULL);... 
14190 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
141a0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
141b0 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
141c0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
141d0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
141e0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
141f0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14200 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
14210 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
14220 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
14230 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
14240 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
14250 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
14260 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
14270 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,pemout,buffer,0
14280 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
14290 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
142a0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
142b0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
142c0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
142d0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
142e0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
142f0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a  me(out,pemout);.
14300 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
14310 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
14320 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14330 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d  ee_all(out);...}
14340 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65  ....X509_free(ce
14350 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  rt);...EVP_PKEY_
14360 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
14370 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14380 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
14390 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62  000L...BN_free(b
143a0 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20  ne);.#endif..   
143b0 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20   }..}..break;.  
143c0 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61    default:..brea
143d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
143e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
143f0 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
14400 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a  Data;.}.../*****
14410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14420 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20  ./* Init        
14430 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
14440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
14450 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
144a0 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a  ls_Free --. *. *
144b0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
144c0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
144d0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
144e0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
144f0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
14500 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
14510 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a  alls below 1. *.
14520 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
14530 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
14540 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
14550 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
14560 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
145b0 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a  .Tls_Free(char *
145c0 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20  blockPtr) {.    
145d0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
145e0 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b  = (State *)block
145f0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  Ptr;..    dprint
14600 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
14610 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74    Tls_Clean(stat
14620 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65  ePtr);.    ckfre
14630 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c  e(blockPtr);.}..
14640 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14680 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
14690 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a  Tls_Clean --. *.
146a0 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
146b0 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
146c0 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
146d0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
146e0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
146f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
14700 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20   falls below 1. 
14710 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09   This should. *.
14720 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72  be called synchr
14730 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43  onously by the C
14740 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e  loseProc, not in
14750 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c   the. *.Eventual
14760 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e  lyFree callback.
14770 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
14780 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.none. *. * Si
14790 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46  de effects:. *.F
147a0 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61  rees all the sta
147b0 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  te. *. *--------
147c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
14800 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53  void Tls_Clean(S
14810 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20  tate *statePtr) 
14820 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  {.    dprintf("C
14830 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
14840 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73  .     * we're as
14850 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74  suming here that
14860 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68   we're single-th
14870 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20  readed.     */. 
14880 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14890 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54  >timer != (Tcl_T
148a0 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29  imerToken) NULL)
148b0 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69   {..Tcl_DeleteTi
148c0 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65  merHandler(state
148d0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74  Ptr->timer);..st
148e0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
148f0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
14900 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
14910 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65  rotos) {..ckfree
14920 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
14930 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  s);..statePtr->p
14940 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rotos = NULL;.  
14950 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14960 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a  ePtr->bio) {../*
14970 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20   This will call 
14980 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75  SSL_shutdown. Bu
14990 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70  g 1414045 */..dp
149a0 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f  rintf("BIO_free_
149b0 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50  all(%p)", stateP
149c0 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66  tr->bio);..BIO_f
149d0 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72  ree_all(statePtr
149e0 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74  ->bio);..statePt
149f0 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  r->bio = NULL;. 
14a00 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
14a10 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64  tePtr->ssl) {..d
14a20 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65  printf("SSL_free
14a30 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
14a40 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65  >ssl);..SSL_free
14a50 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
14a60 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20  ..statePtr->ssl 
14a70 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14a80 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14a90 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ctx) {..SSL_CTX_
14aa0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63  free(statePtr->c
14ab0 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tx);..statePtr->
14ac0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
14ad0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14ae0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a  tr->callback) {.
14af0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
14b00 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
14b10 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72  back);..statePtr
14b20 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c  ->callback = NUL
14b30 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14b40 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
14b50 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ord) {..Tcl_Decr
14b60 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
14b70 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73  r->password);..s
14b80 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
14b90 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
14ba0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14bb0 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44  ->vcmd) {..Tcl_D
14bc0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
14bd0 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74  ePtr->vcmd);..st
14be0 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e  atePtr->vcmd = N
14bf0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
14c00 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
14c10 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43  ng");.}...#if TC
14c20 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
14c30 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  > 8.#define MIN_
14c40 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65  VERSION "9.0".#e
14c50 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  lse.#define MIN_
14c60 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65  VERSION "8.5".#e
14c70 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ndif../*. *-----
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14cc0 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
14cd0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
14ce0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
14cf0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
14d00 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
14d10 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65  ed. *.by Tcl whe
14d20 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
14d30 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
14d40 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
14d50 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20  . *. * Results: 
14d60 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20   Ssl configured 
14d70 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a  and loaded. *. *
14d80 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14d90 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73  *. create the ss
14da0 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69  l command, initi
14db0 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78  alize ssl contex
14dc0 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44  ----------. */.D
14e10 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
14e20 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
14e30 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
14e40 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63  const char tlsTc
14e50 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20  lInitScript[] = 
14e60 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e  {.#include "tls.
14e70 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20  tcl.h"..0x00.   
14e80 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   };..    dprintf
14e90 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
14ea0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
14eb0 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e  S.    if (Tcl_In
14ec0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
14ed0 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
14ee0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
14ef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
14f10 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72  f (Tcl_PkgRequir
14f20 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c  e(interp, "Tcl",
14f30 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29   MIN_VERSION, 0)
14f40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
14f50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14f60 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c     }..    if (Tl
14f70 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54  sLibInit(0) != T
14f80 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70  CL_OK) {..Tcl_Ap
14f90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14fa0 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e  p, "could not in
14fb0 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62  itialize SSL lib
14fc0 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20  rary", (char *) 
14fd0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
14fe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14ff0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15000 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15010 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  , "tls::ciphers"
15020 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c  , CiphersObjCmd,
15030 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
15040 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15050 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15060 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15070 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15080 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22  tls::connection"
15090 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  , ConnectionInfo
150a0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
150b0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
150c0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
150d0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
150e0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
150f0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64  terp, "tls::hand
15100 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b  shake", Handshak
15110 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  eObjCmd, (Client
15120 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
15130 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15140 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15150 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15160 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70  nterp, "tls::imp
15170 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43  ort", ImportObjC
15180 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15190 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
151a0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
151b0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
151c0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
151d0 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74  , "tls::unimport
151e0 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
151f0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15200 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
15210 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15220 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15230 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15240 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20   "tls::status", 
15250 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43  StatusObjCmd, (C
15260 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
15270 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15280 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15290 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
152a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
152b0 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
152c0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ionObjCmd, (Clie
152d0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
152e0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
152f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15300 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15310 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d  (interp, "tls::m
15320 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64  isc", MiscObjCmd
15330 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
15340 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15350 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15360 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15370 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15380 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  "tls::protocols"
15390 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  , ProtocolsObjCm
153a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
153b0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
153c0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
153d0 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29  .    if (interp)
153e0 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74   {..Tcl_Eval(int
153f0 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53  erp, tlsTclInitS
15400 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  cript);.    }.. 
15410 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b     return Tcl_Pk
15420 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
15430 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50   PACKAGE_NAME, P
15440 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
15450 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15490 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49  . *. *.Tls_SafeI
154a0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
154b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
154e0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65  *.Standard proce
154f0 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79  dure required by
15500 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74   'load'.. *.Init
15510 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74  ializes this ext
15520 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66  ension for a saf
15530 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  e interpreter.. 
15540 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15570 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
15580 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f  ffects:. *..As o
15590 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
155a0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
155b0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72   standard Tcl er
155c0 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ror code.. *. *-
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15600 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58  -----*. */.DLLEX
15610 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66  PORT int Tls_Saf
15620 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
15630 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
15640 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
15650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c  );.    return(Tl
15660 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b  s_Init(interp));
15670 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
156b0 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69  . *. *.TlsLibIni
156c0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
15700 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  Initializes SSL 
15710 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72  library once per
15720 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09   application. *.
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15760 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66  *. *. *.Side eff
15770 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61  ects:. *..initia
15780 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
15790 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  y. *. *.Result:.
157a0 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d   *..none. *. *--
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157e0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
157f0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28   int TlsLibInit(
15800 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
15810 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ) {.    static i
15820 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  nt initialized =
15830 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74   0;.    int stat
15840 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66  us = TCL_OK;.#if
15850 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15860 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15870 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15880 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d  ).    size_t num
15890 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a  _locks;.#endif..
158a0 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61      if (uninitia
158b0 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e  lize) {..if (!in
158c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20  itialized) {..  
158d0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
158e0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   to uninitialize
158f0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74  , but we are not
15900 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a   initialized");.
15910 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
15920 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e  _OK);..}...dprin
15930 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
15940 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69  nitialize");..#i
15950 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
15960 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
15970 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
15980 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63  S)..Tcl_MutexLoc
15990 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69  k(&init_mx);...i
159a0 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20  f (locks) {..   
159b0 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20   free(locks);.. 
159c0 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b     locks = NULL;
159d0 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74  ..    locksCount
159e0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a   = 0;..}.#endif.
159f0 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  .initialized = 0
15a00 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15a10 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15a20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15a30 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
15a40 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
15a50 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  x);.#endif...ret
15a60 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20  urn(TCL_OK);.   
15a70 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74   }..    if (init
15a80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69  ialized) {..dpri
15a90 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74  ntf("Called, but
15aa0 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61   using cached va
15ab0 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73  lue");..return(s
15ac0 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  tatus);.    }.. 
15ad0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
15ae0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
15af0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15b00 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15b10 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15b20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
15b30 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
15b40 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
15b50 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 1;..#if define
15b60 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15b70 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15b80 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e  L_THREADS).    n
15b90 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20  um_locks = 1;.  
15ba0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28    locksCount = (
15bb0 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  int) num_locks;.
15bc0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c      locks = mall
15bd0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  oc(sizeof(*locks
15be0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
15bf0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73      memset(locks
15c00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63  , 0, sizeof(*loc
15c10 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
15c20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
15c30 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48   Initialize BOTH
15c40 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c   libcrypto and l
15c50 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50  ibssl. */.    OP
15c60 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f  ENSSL_init_ssl(O
15c70 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15c80 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f  _SSL_STRINGS | O
15c90 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15ca0 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a  _CRYPTO_STRINGS.
15cb0 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  .| OPENSSL_INIT_
15cc0 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20  ADD_ALL_CIPHERS 
15cd0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
15ce0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20  DD_ALL_DIGESTS, 
15cf0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
15d00 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29  new_tcl(NULL, 0)
15d10 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a  ;..#if 0.    /*.
15d20 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a       * XXX:TODO:
15d30 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64   Remove this cod
15d40 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  e and replace it
15d50 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20   with a check.  
15d60 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20     * for enough 
15d70 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e  entropy and do n
15d80 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ot try to create
15d90 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20   our own.     * 
15da0 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79  terrible entropy
15db0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a  .     */.    /*.
15dc0 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20       * Seed the 
15dd0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
15de0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53  nerator in the S
15df0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20  SL library,.    
15e00 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f   * using the do/
15e10 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20  while construct 
15e20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62  because of the b
15e30 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20  ug note in the. 
15e40 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41      * OpenSSL FA
15e50 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  Q at http://www.
15e60 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70  openssl.org/supp
15e70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45  ort/faq.html#USE
15e80 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  R1.     *.     *
15e90 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65   The crux of the
15ea0 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74   problem is that
15eb0 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20   Solaris 7 does 
15ec0 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20  not have a.     
15ed0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72  * /dev/random or
15ee0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65   /dev/urandom de
15ef0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f  vice so it canno
15f00 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a  t gather enough.
15f10 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66       * entropy f
15f20 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65  rom the RAND_see
15f30 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69  d() when TLS ini
15f40 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66  tializes and ref
15f50 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67  uses.     * to g
15f60 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69  o further. Earli
15f70 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f  er versions of O
15f80 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f  penSSL carried o
15f90 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  n regardless..  
15fa0 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28     */.    srand(
15fb0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
15fc0 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e  ime((time_t *) N
15fd0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a  ULL));.    do {.
15fe0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
15ff0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20   16; i++) {..   
16000 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31   rnd_seed[i] = 1
16010 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30   + (char) (255.0
16020 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f   * rand()/(RAND_
16030 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52  MAX+1.0));..}..R
16040 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65  AND_seed(rnd_see
16050 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65  d, sizeof(rnd_se
16060 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c  ed));.    } whil
16070 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29  e (RAND_status()
16080 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a   != 1);.#endif..
16090 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
160a0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
160b0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
160c0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55  ADS)..Tcl_MutexU
160d0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  nlock(&init_mx);
160e0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e  .#endif...return
160f0 28 73 74 61 74 75 73 29 3b 0a 7d 0a              (status);.}.