Hex Artifact Content

Artifact 62ec7882d5b5c0a333aebdbb7ef972d7b267ac01ba10341a8ef98dc676303f55:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20  * Callbacks     
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 0a  ***********/....
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
0a20: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0a30: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53  *. *.monitors SS
0a40: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0a50: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0a60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0a80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0a90: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0aa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0af0: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63  void.InfoCallbac
0b00: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
0b10: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
0b20: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74   ret) {.    Stat
0b30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
0b40: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
0b50: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
0b60: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
0b70: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
0b80: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
0b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
0ba0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61  tr;.    char *ma
0bb0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72  jor; char *minor
0bc0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0bd0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0be0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0bf0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0c00: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
0c10: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  ;..    cmdPtr = 
0c20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
0c30: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
0c40: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  ack);..#if 0.   
0c50: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
0c60: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65  _CB_ALERT) {..se
0c70: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79  v = SSL_alert_ty
0c80: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  pe_string_long(r
0c90: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70  et);..if (strcmp
0ca0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d  (sev, "fatal")==
0cb0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65  0) {./* Map to e
0cc0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73  rror */..    Tls
0cd0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
0ce0: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20   SSL_ERROR(ssl, 
0cf0: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  0));..    return
0d00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ;..}.    }.#endi
0d10: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  f.    if (where 
0d20: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
0d30: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
0d40: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
0d50: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
0d60: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
0d70: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0d80: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
0d90: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
0da0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
0db0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
0dc0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
0dd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
0de0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
0df0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
0e10: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
0e20: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
0e30: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
0e40: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
0e50: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
0e60: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
0e70: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
0e80: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
0e90: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
0ea0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
0eb0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
0ec0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
0ed0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
0ee0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0ef0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
0f00: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
0f10: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f20: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
0f30: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
0f40: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
0f50: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
0f60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
0f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
0f80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
0f90: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f  wStringObj("info
0fa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
0fb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
0fd0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
0fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
0ff0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
1000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
1010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1040: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1050: 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b  Obj(major, -1));
1060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
10a0: 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  inor, -1));..   
10b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53   if (where & (SS
10c0: 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42  L_CB_LOOP|SSL_CB
10d0: 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c  _EXIT)) {..Tcl_L
10e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1100: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1110: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74  StringObj(SSL_st
1120: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
1130: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ssl), -1));.    
1140: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1150: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
1160: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
1170: 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53  cp = (char *) SS
1180: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1190: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a  ing_long(ret);..
11a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
11d0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
11e0: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
11f0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
1200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1230: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69  j(SSL_state_stri
1240: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31  ng_long(ssl), -1
1250: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ));.    }.    Tc
1260: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
1270: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
1280: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
1290: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
12a0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54  tatePtr);..    T
12b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
12c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f  cmdPtr);.    (vo
12d0: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  id) Tcl_EvalObjE
12e0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  x(interp, cmdPtr
12f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
1300: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  L);.    Tcl_Decr
1310: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
1320: 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  ;..    Tcl_Relea
1330: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
1340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
1350: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
1360: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
1370: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13c0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61  . * VerifyCallba
13d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
13e0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69  tors SSL certifi
13f0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20  cate validation 
1400: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73  process.. *.This
1410: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
1420: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74  ver a certificat
1430: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20  e is inspected. 
1440: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76  *.or decided inv
1450: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  alid.. *. * Resu
1460: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61  lts:. *.A callba
1470: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ck bound to the 
1480: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72  socket may retur
1490: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20  n one of:. *.   
14a0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   0...- the certi
14b0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
14c0: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20   invalid. *.    
14d0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
14e0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
14f0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70  valid. *.    emp
1500: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63  ty string.- no c
1510: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69  hange to certifi
1520: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a  cate validation.
1530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1540: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
1550: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
1560: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
1570: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
1580: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
1590: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
15a0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
15b0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d  lure reason. *--
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
1610: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
1620: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
1630: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
1640: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1650: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20  tr, *result;.   
1660: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a   char *errStr, *
1670: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20  string;.    int 
1680: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20  length;.    SSL 
1690: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29    *ssl..= (SSL*)
16a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
16b0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20  et_ex_data(ctx, 
16c0: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f  SSL_get_ex_data_
16d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69  X509_STORE_CTX_i
16e0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20  dx());.    X509 
16f0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53   *cert..= X509_S
1700: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72  TORE_CTX_get_cur
1710: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a  rent_cert(ctx);.
1720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
1730: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr.= (State*)SS
1740: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_get_app_data(s
1750: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  sl);.    Tcl_Int
1760: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
1770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
1780: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d      int depth..=
1790: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
17a0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28  get_error_depth(
17b0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72  ctx);.    int er
17c0: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  r..= X509_STORE_
17d0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74  CTX_get_error(ct
17e0: 78 29 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  x);.    int code
17f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
1800: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29  Verify: %d", ok)
1810: 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29 20  ;..    if (!ok) 
1820: 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61  {..errStr = (cha
1830: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
1840: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
1850: 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (err);.    } els
1860: 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63  e {..errStr = (c
1870: 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a  har *)0;.    }..
1880: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
1890: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
18a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
18b0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76  .if (statePtr->v
18c0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49  flags & SSL_VERI
18d0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
18e0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20  ER_CERT) {..    
18f0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c  return ok;..} el
1900: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
1910: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20   1;..}.    }.   
1920: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
1930: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
1940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
1950: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1960: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1970: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1980: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1990: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20  verify", -1));. 
19a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
19b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
19c0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
19d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
19e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
19f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
1a00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
1a40: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20  bj(depth));.    
1a50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1a60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1a70: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77   cmdPtr, Tls_New
1a80: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
1a90: 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f  cert));.    Tcl_
1aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
1ad0: 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c  bj(ok));.    Tcl
1ae0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1af0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1b00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
1b10: 69 6e 67 4f 62 6a 28 65 72 72 53 74 72 20 3f 20  ingObj(errStr ? 
1b20: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29  errStr : "", -1)
1b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
1b40: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
1b50: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
1b60: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
1b70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1b80: 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  r);..    statePt
1b90: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
1ba0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20  TCL_CALLBACK;.. 
1bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1bc0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
1bd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
1be0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
1bf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
1c00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
1c10: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
1c20: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20  {../* It got an 
1c30: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74  error - reject t
1c40: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09  he certificate..
1c50: 09 2a 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  .*/.#if (TCL_MAJ
1c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
1c70: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
1c80: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
1c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
1ca0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
1cb0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
1cc0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
1cd0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09   code);.#endif..
1ce0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c  ok = 0;.    } el
1cf0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54  se {..result = T
1d00: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
1d10: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67  interp);..string
1d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1d30: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20  FromObj(result, 
1d40: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e  &length);../* An
1d50: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65   empty result le
1d60: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f  aves verificatio
1d70: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a  n unchanged..*/.
1d80: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e  .if (string != N
1d90: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20  ULL && length > 
1da0: 30 29 20 7b 0a 09 20 20 20 20 63 6f 64 65 20 3d  0) {..    code =
1db0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1dc0: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  bj(interp, resul
1dd0: 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66  t, &ok);..    if
1de0: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
1df0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
1e00: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
1e10: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
1e20: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63  ERSION < 6)...Tc
1e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
1e40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
1e50: 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  ...Tcl_Backgroun
1e60: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
1e70: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
1e80: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20  ...ok = 0;..    
1e90: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54  }..}.    }.    T
1ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1eb0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74  cmdPtr);..    st
1ec0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
1ed0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   ~(TLS_TCL_CALLB
1ee0: 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  ACK);..    Tcl_R
1ef0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
1f00: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
1f10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
1f20: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
1f30: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  rp);.    return(
1f40: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75  ok);./* By defau
1f50: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69  lt, leave verifi
1f60: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  cation unchanged
1f70: 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ..*/.}.../*. *--
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f  -. *. * Tls_Erro
1fd0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73  r --. *. *.Calls
1fe0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24   callback with $
1ff0: 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f  fd and $msg - so
2000: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61   the callback ca
2010: 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74  n decide. *.what
2020: 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f   to do with erro
2030: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  rs.. *. * Side e
2040: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65  ffects:. *.The e
2050: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  rr field of the 
2060: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74  currently operat
2070: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74  ive State is set
2080: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e  . *.  to a strin
2090: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
20a0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
20b0: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a   failure reason.
20c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
2110: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a  ls_Error(State *
2120: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a  statePtr, char *
2130: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49  msg) {.    Tcl_I
2140: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
2150: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
2170: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
2180: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ode;..    dprint
2190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
21a0: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73    if (msg && *ms
21b0: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  g) {..Tcl_SetErr
21c0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
21d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72  SSL", msg, (char
21e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20   *)NULL);.    } 
21f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63  else {..msg = Tc
2200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
2210: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c  ult(interp), NUL
2230: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  L);.    }.    st
2240: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73  atePtr->err = ms
2250: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  g;..    if (stat
2260: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
2270: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
2280: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
2290: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28  FSIZ];..sprintf(
22a0: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65  buf, "SSL channe
22b0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a  l \"%s\": error:
22c0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47   %s",..    Tcl_G
22d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
22e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d  atePtr->self), m
22f0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73  sg);..Tcl_SetRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 62 75 66 2c  ult(interp, buf,
2310: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
2320: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
2330: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
2340: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
2350: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
2360: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
2370: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
2380: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
2390: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 54 43 4c  tion(interp, TCL
23a0: 5f 45 52 52 4f 52 29 3b 0a 23 65 6e 64 69 66 0a  _ERROR);.#endif.
23b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20  .return;.    }. 
23c0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
23d0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
23e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
23f0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
2400: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2410: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2430: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a  ("error", -1));.
2440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2460: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
2470: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
2480: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2490: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
24a0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
24d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
24f0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  -1));..    Tcl_P
2500: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2510: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
2520: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
2530: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
2540: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ePtr);..    Tcl_
2550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
2560: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  Ptr);.    code =
2570: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
2580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2590: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
25a0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d  .    if (code !=
25b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28   TCL_OK) {.#if (
25c0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
25d0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
25e0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
25f0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
2600: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
2610: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
2620: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
2630: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
2640: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2660: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63  (cmdPtr);.    Tc
2670: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
2680: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2690: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
26a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
26b0: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  nterp);.}.../*. 
26c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2700: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
2710: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
2720: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
2730: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
2740: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
2750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
2760: 6f 6e 65 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  one. *----------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
27b0: 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63  id KeyLogCallbac
27c0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
27d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69  , const char *li
27e0: 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ne) {.    char *
27f0: 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c  str = getenv(SSL
2800: 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20  KEYLOGFILE);.   
2810: 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69   FILE *fd;.    i
2820: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20  f (str) {..fd = 
2830: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b  fopen(str, "a");
2840: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25  ..fprintf(fd, "%
2850: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c  s\n",line);..fcl
2860: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d  ose(fd);.    }.}
2870: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
28c0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62  * Password Callb
28d0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ack --. *. *.Cal
28e0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77  led when a passw
28f0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f  ord is needed to
2900: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20   unpack RSA and 
2910: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61  PEM keys.. *.Eva
2920: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73  ls any bound pas
2930: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64  sword script and
2940: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73   returns the res
2950: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61  ult as. *.the pa
2960: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20  ssword string.. 
2970: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
29c0: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
29d0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
29e0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65  int size, int ve
29f0: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74  rify, void *udat
2a00: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
2a10: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2a20: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a40: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
2a50: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
2a60: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
2a70: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64  int code;..    d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
2a90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d  Ptr->password ==
2ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63   NULL) {..if (Tc
2ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c  l_EvalEx(interp,
2ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
2ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
2af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b  LOBAL) == TCL_OK
2b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72  ) {..    char *r
2b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
2b20: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
2b30: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20  t(interp);..    
2b40: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
2b50: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29  , (size_t) size)
2b60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
2b70: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a  nt)strlen(ret);.
2b80: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2b90: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20  eturn -1;..}.   
2ba0: 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   }..    cmdPtr =
2bb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
2bc0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
2bd0: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  word);..    Tcl_
2be0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
2bf0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
2c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
2c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2c20: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  tePtr);..    Tcl
2c30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2c40: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
2c50: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
2c60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c70: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
2c80: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
2c90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
2ca0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
2cb0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
2cc0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
2cd0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
2ce0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
2cf0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
2d00: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
2d10: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
2d20: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2d40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
2d50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
2d60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2d70: 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64  r);..    if (cod
2d80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
2d90: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61  char *ret = (cha
2da0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69  r *) Tcl_GetStri
2db0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
2dc0: 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65  ;..if (strlen(re
2dd0: 74 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b  t) < size - 1) {
2de0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75  ..    strncpy(bu
2df0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
2e00: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c   size);..    Tcl
2e10: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
2e20: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
2e30: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
2e40: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a  strlen(ret);..}.
2e50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65      }.    Tcl_Re
2e60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
2e70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
2e80: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69  return -1;..veri
2e90: 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c  fy = verify;.}..
2ea0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2ef0: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
2f00: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
2f10: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
2f20: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
2f30: 74 69 63 6b 65 74 20 68 61 73 20 62 65 65 6e 20  ticket has been 
2f40: 72 65 63 65 69 76 65 64 2e 20 49 6e 20 54 4c 53  received. In TLS
2f50: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79   1.3. *.this may
2f60: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c   be received mul
2f70: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65  tiple times afte
2f80: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  r the handshake.
2f90: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20   For. *.earlier 
2fa0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77  versions, this w
2fb0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20  ill be received 
2fc0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73  during the hands
2fd0: 68 61 6b 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  hake.. *. * Resu
2fe0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
2ff0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3000: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3010: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
3020: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
3070: 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c   int.SessionCall
3080: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3090: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ssl, SSL_SESSION
30a0: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20   *session) {.   
30b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
30c0: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67   = (State*)SSL_g
30d0: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c  et_app_data((SSL
30e0: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c   *)ssl);.    Tcl
30f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
3100: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
3110: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
3120: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e  *cmdPtr;.    con
3130: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3140: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f   *ticket;.    co
3150: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3160: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20  r *session_id;. 
3170: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
3180: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 73 69  int code;.    si
3190: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 0a 20 20 20 20  ze_t len2;..    
31a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
31b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
31c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
31d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
31e0: 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20  )..return 0;..  
31f0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
3200: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3210: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3220: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3230: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3240: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3250: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3260: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
3270: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
3280: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
3290: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
32a0: 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65  ON_get0_id_conte
32b0: 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 6c 65 6e  xt(session, &len
32c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
32d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
32e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
32f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3300: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 6c 65 6e  (session_id, len
3310: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
3320: 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20  ion ticket */.  
3330: 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65    SSL_SESSION_ge
3340: 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f  t0_ticket(sessio
3350: 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
3360: 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  2);.    Tcl_List
3370: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3380: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
33a0: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 6c  j(ticket, (int)l
33b0: 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  en2));..    /* L
33c0: 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72  ifetime - number
33d0: 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20   of seconds */. 
33e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
33f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3400: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
3410: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e  _NewLongObj((lon
3420: 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  g) SSL_SESSION_g
3430: 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69  et_ticket_lifeti
3440: 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29  me_hint(session)
3450: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65  ));..    Tcl_Pre
3460: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3470: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
3480: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
3490: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
34a0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e  tr);..    Tcl_In
34b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
34c0: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54  r);.    code = T
34d0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
34e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
34f0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
3500: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54     if (code != T
3510: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43  CL_OK) {.#if (TC
3520: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
3530: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
3540: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
3550: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3560: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
3570: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
3580: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
3590: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
35a0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  dif.    }.    Tc
35b0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
35c0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
35d0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
35e0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
35f0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
3600: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3610: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72  terp);.    retur
3620: 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  n 1;.}.../*. *--
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c  -. *. * ALPN Cal
3680: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
3690: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 6c 65 63  s --. *. *.Selec
36a0: 74 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c  t which protocol
36b0: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20   (http/1.1, h2, 
36c0: 68 33 2c 20 65 74 63 2e 29 20 74 6f 20 75 73 65  h3, etc.) to use
36d0: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f   for the. *.inco
36e0: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ming connection.
36f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3700: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
3710: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
3720: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
3730: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
3740: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
3750: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
3760: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63  _OK: ALPN protoc
3770: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
3780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
3790: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
37a0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
37b0: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20  ATAL: There was 
37c0: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  no overlap betwe
37d0: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a  en the client's.
37e0: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20   *.    supplied 
37f0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72  list and the ser
3800: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ver configuratio
3810: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  n. The connectio
3820: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65  n will be aborte
3830: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  d.. *.SSL_TLSEXT
3840: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e  _ERR_NOACK: ALPN
3850: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65   protocol not se
3860: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65  lected, e.g., be
3870: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a  cause no ALPN. *
3880: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61  .    protocols a
3890: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  re configured fo
38a0: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
38b0: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  n. The connectio
38c0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
38d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
3920: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63   int.ALPNCallbac
3930: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
3940: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
3950: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
3960: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c  igned char *outl
3970: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en,..const unsig
3980: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e  ned char *in, un
3990: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e  signed int inlen
39a0: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
39b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
39c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
39d0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
39e0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
39f0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
3a00: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
3a10: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  ;.    int code;.
3a20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3a30: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
3a40: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
3a50: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
3a60: 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 53  )NULL)..return S
3a70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
3a80: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
3a90: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
3aa0: 20 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74   SSL_select_next
3ab0: 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c  _proto(out, outl
3ac0: 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72  en, statePtr->pr
3ad0: 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e  otos, statePtr->
3ae0: 70 72 6f 74 6f 73 5f 6c 65 6e 2c 20 69 6e 2c 20  protos_len, in, 
3af0: 69 6e 6c 65 6e 29 3b 0a 0a 20 20 20 20 63 6d 64  inlen);..    cmd
3b00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
3b10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
3b20: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
3b30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3b40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3b50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3b60: 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22  StringObj("alpn"
3b70: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
3b80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3b90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3ba0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3bb0: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29  ngObj(*out, -1))
3bc0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3bd0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3be0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
3bf0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
3c00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
3c10: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  );..    Tcl_Incr
3c20: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3c30: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
3c40: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
3c50: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
3c60: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
3c70: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c   if (code != TCL
3c80: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f  _OK) {.#if (TCL_
3c90: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
3ca0: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
3cb0: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
3cc0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
3cd0: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
3ce0: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
3cf0: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
3d00: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69  rp, code);.#endi
3d10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  f.    }.    Tcl_
3d20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
3d30: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  Ptr);..    Tcl_R
3d40: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3d50: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
3d60: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3d70: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3d80: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
3d90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
3da0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3df0: 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61   *. * SNI Callba
3e00: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d  ck for Servers -
3e10: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20  -. *. *.Perform 
3e20: 73 65 72 76 65 72 20 6e 61 6d 65 20 73 65 6c 65  server name sele
3e30: 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75  ction. *. * Resu
3e40: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
3e50: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3e60: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3e70: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
3e80: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
3e90: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
3ea0: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f  T_ERR_OK: SNI ho
3eb0: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74  stname is accept
3ec0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
3ed0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
3ee0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
3ef0: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49  ALERT_FATAL: SNI
3f00: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
3f10: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
3f20: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20  onnection. *.   
3f30: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66   is aborted. Def
3f40: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69  ault for alert i
3f50: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  s SSL_AD_UNRECOG
3f60: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53  NIZED_NAME.. *.S
3f70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
3f80: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49  ERT_WARNING: SNI
3f90: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
3fa0: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69   accepted, warni
3fb0: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20  ng alert. *.    
3fc0: 73 65 6e 74 20 28 6e 6f 74 20 69 6e 20 54 4c 53  sent (not in TLS
3fd0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65  v1.3). The conne
3fe0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
3ff0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4000: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f  RR_NOACK: SNI ho
4010: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
4020: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61  cepted and not a
4030: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09  cknowledged,. *.
4040: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20      e.g. if SNI 
4050: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e  has not been con
4060: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e  figured. The con
4070: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4080: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
40d0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61  static int.SNICa
40e0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
40f0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
4100: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
4110: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4120: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
4130: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
4140: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4150: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4160: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4170: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b  r;.    int code;
4180: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
4190: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
41a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
41b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
41c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
41d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
41e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
41f0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4200: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4210: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
4220: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4230: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4240: 20 20 7d 0a 0a 20 20 20 20 73 65 72 76 65 72 6e    }..    servern
4250: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ame = SSL_get_se
4260: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
4270: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
4280: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  st_name);.    if
4290: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c   (!servername ||
42a0: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d   servername[0] =
42b0: 3d 20 27 5c 30 27 29 20 7b 0a 20 20 20 20 20 20  = '\0') {.      
42c0: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53    return SSL_TLS
42d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
42e0: 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72     }..    cmdPtr
42f0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4300: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
4310: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
4320: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4330: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4340: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
4350: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31  ingObj("sni", -1
4360: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4370: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4380: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
43a0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
43b0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  1));..    Tcl_Pr
43c0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
43d0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
43e0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
43f0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
4400: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
4410: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4420: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
4430: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
4440: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
4450: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
4460: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
4470: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
4480: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
4490: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
44a0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
44b0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
44c0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
44d0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
44e0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
44f0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
4500: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
4510: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4520: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
4530: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
4540: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
4550: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
4560: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
4570: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
4580: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4590: 52 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  R_OK;.}.../*. *-
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 0a 20 2a 0a 20 2a 20 48 65 6c 6c 6f 20 43  --. *. * Hello C
45f0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
4600: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65  ers --. *. *.Use
4610: 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65  d by server to e
4620: 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65  xamine the serve
4630: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
4640: 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f  n (SNI) extensio
4650: 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79  n. *.provided by
4660: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f   the client in o
4670: 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61  rder to select a
4680: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65  n appropriate ce
4690: 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09  rtificate to. *.
46a0: 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b  present, and mak
46b0: 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72  e other configur
46c0: 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74  ation adjustment
46d0: 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68  s relevant to th
46e0: 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d  at server. *.nam
46f0: 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67  e and its config
4700: 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e  uration. This in
4710: 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20  cludes swapping 
4720: 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  out the associat
4730: 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f  ed. *.SSL_CTX po
4740: 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67  inter, modifying
4750: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69   the server's li
4760: 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20  st of permitted 
4770: 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 2a 09  TLS versions,.*.
4780: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72  changing the ser
4790: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73  ver's cipher lis
47a0: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  t in response to
47b0: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69   the client's ci
47c0: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a  pher list, etc..
47d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
47e0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
47f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4800: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4810: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4820: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4830: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
4840: 4f 5f 52 45 54 52 59 20 3d 20 73 75 73 70 65 6e  O_RETRY = suspen
4850: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c  d the handshake,
4860: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61   and the handsha
4870: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ke function will
4880: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
4890: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  ely. *.SSL_CLIEN
48a0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 20 3d 20  T_HELLO_ERROR = 
48b0: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61  failure, termina
48c0: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53  te connection. S
48d0: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f  et alert to erro
48e0: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43  r code.. *.SSL_C
48f0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
4900: 45 53 53 20 3d 20 73 75 63 63 65 73 73 0a 20 2a  ESS = success. *
4910: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4960: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62  c int.HelloCallb
4970: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
4980: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20  sl, int *alert, 
4990: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
49a0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
49b0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
49c0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
49d0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
49e0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
49f0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4a00: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
4a10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
4a20: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  rvername;.    co
4a30: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4a40: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74  r *p;.    size_t
4a50: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b   len, remaining;
4a60: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4a70: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4a80: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
4a90: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
4aa0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20  *)NULL)..return 
4ab0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
4ac0: 5f 53 55 43 43 45 53 53 3b 0a 0a 20 20 20 20 2f  _SUCCESS;..    /
4ad0: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20  * Get names */. 
4ae0: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65     if (!SSL_clie
4af0: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78  nt_hello_get0_ex
4b00: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59  t(ssl, TLSEXT_TY
4b10: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20  PE_server_name, 
4b20: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20  &p, &remaining) 
4b30: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  || remaining <= 
4b40: 32 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  2) {.        ret
4b50: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
4b60: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
4b70: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
4b80: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
4b90: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73  the supplied lis
4ba0: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20  t of names. */. 
4bb0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
4bc0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
4bd0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
4be0: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65  f (len + 2 != re
4bf0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20  maining) {.     
4c00: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c     return SSL_CL
4c10: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
4c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
4c30: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20  ining = len;..  
4c40: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e    /* The list in
4c50: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68   practice only h
4c60: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  as a single elem
4c70: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20  ent, so we only 
4c80: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72  consider the fir
4c90: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  st one. */.    i
4ca0: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  f (remaining == 
4cb0: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53  0 || *p++ != TLS
4cc0: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
4cd0: 74 5f 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20  t_name) {.      
4ce0: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49    return SSL_CLI
4cf0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
4d00: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
4d10: 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20  ning--;..    /* 
4d20: 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c  Now we can final
4d30: 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20  ly pull out the 
4d40: 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20  byte array with 
4d50: 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e  the actual hostn
4d60: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ame. */.    if (
4d70: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20  remaining <= 2) 
4d80: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4d90: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
4da0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
4db0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
4dc0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
4dd0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
4de0: 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d  f (len + 2 > rem
4df0: 61 69 6e 69 6e 67 29 20 7b 0a 20 20 20 20 20 20  aining) {.      
4e00: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49    return SSL_CLI
4e10: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
4e20: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
4e30: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  ning = len;.    
4e40: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f  servername = (co
4e50: 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20  nst char *)p;.. 
4e60: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
4e70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
4e80: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
4e90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4ea0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4eb0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4ec0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4ed0: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20  "hello", -1));. 
4ee0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4ef0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4f00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4f10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
4f20: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 6c 65  vername, (int)le
4f30: 6e 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  n));..    Tcl_Pr
4f40: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
4f50: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
4f60: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
4f70: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
4f80: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
4f90: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4fa0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
4fb0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
4fc0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
4fd0: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
4fe0: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
4ff0: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
5000: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
5010: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
5020: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
5030: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
5040: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
5050: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
5060: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
5070: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
5080: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
5090: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
50a0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
50b0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
50c0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
50d0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
50e0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
50f0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
5100: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
5110: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 7d 0a 0c  LLO_SUCCESS;.}..
5120: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
5130: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61  ******/./* Comma
5140: 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f  nds         */./
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5160: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
51b0: 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a   *. * CiphersObj
51c0: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69  Cmd -- list avai
51d0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a  lable ciphers. *
51e0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
51f0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
5200: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c   process the "tl
5210: 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d  s::ciphers" comm
5220: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61  and. *.to list a
5230: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
5240: 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f  , based upon pro
5250: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a  tocol selected..
5260: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5270: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
5280: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a   result list.. *
5290: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
52a0: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20  :. *.constructs 
52b0: 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c  and destroys SSL
52c0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20   context (CTX). 
52d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5320: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  ic const char *p
5330: 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09  rotocols[] = {..
5340: 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20  "ssl2", "ssl3", 
5350: 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22  "tls1", "tls1.1"
5360: 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73  , "tls1.2", "tls
5370: 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e  1.3", NULL.};.en
5380: 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20  um protocol {.  
5390: 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f    TLS_SSL2, TLS_
53a0: 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20  SSL3, TLS_TLS1, 
53b0: 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f  TLS_TLS1_1, TLS_
53c0: 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_2, TLS_TLS1
53d0: 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a  _3, TLS_NONE.};.
53e0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68  .static int.Ciph
53f0: 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ersObjCmd(Client
5400: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
5410: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5420: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
5430: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
5440: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
5450: 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55  Obj *objPtr = NU
5460: 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20  LL;.    SSL_CTX 
5470: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ctx = NULL;.   
5480: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c   SSL *ssl = NULL
5490: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53  ;.    STACK_OF(S
54a0: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a  SL_CIPHER) *sk;.
54b0: 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75      char *cp, bu
54c0: 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69  f[BUFSIZ];.    i
54d0: 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73  nt index, verbos
54e0: 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f  e = 0, use_suppo
54f0: 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64  rted = 0;..    d
5500: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5510: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ;..    if ((objc
5520: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e   < 2) || (objc >
5530: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   4)) {..Tcl_Wron
5540: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
5550: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f   1, objv, "proto
5560: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73  col ?verbose? ?s
5570: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65  upported?");..re
5580: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5590: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63      }.    if (Tc
55a0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
55b0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
55c0: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70  ], protocols, "p
55d0: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e  rotocol", 0, &in
55e0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
55f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
5600: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
5610: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26  f ((objc > 2) &&
5620: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
5630: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
5640: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65  bjv[2], &verbose
5650: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
5660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
5680: 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63  (objc > 3) && Tc
5690: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
56a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
56b0: 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72  [3], &use_suppor
56c0: 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ted) != TCL_OK) 
56d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
56e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
56f0: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72  switch ((enum pr
5700: 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a  otocol)index) {.
5710: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a  .case TLS_SSL2:.
5720: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
5730: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
5740: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66  10100000L || def
5750: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c  ined(NO_SSL2) ||
5760: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
5770: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54  _NO_SSL2)..    T
5780: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5790: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
57a0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
57b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
57c0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
57d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
57e0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63  OR;.#else..    c
57f0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
5800: 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29  (SSLv2_method())
5810: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
5820: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a  .case TLS_SSL3:.
5830: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
5840: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
5850: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
5860: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
5870: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
5880: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
5890: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
58a0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
58b0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
58c0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
58d0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
58e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
58f0: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53  lse..    ctx = S
5900: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33  SL_CTX_new(SSLv3
5910: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61  _method()); brea
5920: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
5930: 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65  TLS_TLS1:.#if de
5940: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
5950: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
5960: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  L_NO_TLS1) || de
5970: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
5980: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20  _TLS1_METHOD).. 
5990: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
59a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
59b0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
59c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
59d0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
59e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
59f0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
5a00: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
5a10: 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f  _new(TLSv1_metho
5a20: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  d()); break;.#en
5a30: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
5a40: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_1:.#if define
5a50: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
5a60: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
5a70: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
5a80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
5a90: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
5aa0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5ab0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
5ac0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
5ad0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
5ae0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
5af0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
5b00: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
5b10: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
5b20: 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d  TX_new(TLSv1_1_m
5b30: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
5b40: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
5b50: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65  S_TLS1_2:.#if de
5b60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
5b70: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
5b80: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
5b90: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
5ba0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
5bb0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
5bc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5bd0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
5be0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
5bf0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
5c00: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
5c10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
5c20: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53  lse..    ctx = S
5c30: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31  SL_CTX_new(TLSv1
5c40: 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  _2_method()); br
5c50: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
5c60: 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69  e TLS_TLS1_3:.#i
5c70: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
5c80: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
5c90: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
5ca0: 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  3)..    Tcl_Appe
5cb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5cc0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
5cd0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
5ce0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
5cf0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
5d00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
5d10: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53  se..    ctx = SS
5d20: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65  L_CTX_new(TLS_me
5d30: 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 20 20 20  thod());.       
5d40: 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74       SSL_CTX_set
5d50: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
5d60: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
5d70: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53  ERSION);..    SS
5d80: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
5d90: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
5da0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
5db0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  ;..    break;.#e
5dc0: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ndif..default:..
5dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5de0: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20  .    if (ctx == 
5df0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
5e00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5e10: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
5e20: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
5e30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
5e40: 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63   ssl = SSL_new(c
5e50: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c  tx);.    if (ssl
5e60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
5e70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5e80: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20  terp, REASON(), 
5e90: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
5ea0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
5eb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5ec0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
5ed0: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61  list and order a
5ee0: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20  s would be sent 
5ef0: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  in a ClientHello
5f00: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c   or all availabl
5f10: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20  e ciphers */.   
5f20: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74   if (use_support
5f30: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  ed) {..sk = SSL_
5f40: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63  get1_supported_c
5f50: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
5f60: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20   } else {..sk = 
5f70: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28  SSL_get_ciphers(
5f80: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ssl);.    }..   
5f90: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29   if (sk != NULL)
5fa0: 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65   {..if (!verbose
5fb0: 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20  ) {..    objPtr 
5fc0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
5fd0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  (0, NULL);..    
5fe0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
5ff0: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  i < sk_SSL_CIPHE
6000: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20  R_num(sk); i++) 
6010: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49  {...const SSL_CI
6020: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c  PHER *c = sk_SSL
6030: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b  _CIPHER_value(sk
6040: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d  , i);...if (c ==
6050: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b   NULL) continue;
6060: 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61  ..../* cipher na
6070: 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a  me or (NONE) */.
6080: 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45  ..cp = SSL_CIPHE
6090: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09  R_get_name(c);..
60a0: 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29  .if (cp == NULL)
60b0: 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69   break;...Tcl_Li
60c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
60d0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
60e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
60f0: 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20  Obj(cp, -1));.. 
6100: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a     }...} else {.
6110: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
6120: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6130: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28  ",0);..    for (
6140: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
6150: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
6160: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63  (sk); i++) {...c
6170: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20  onst SSL_CIPHER 
6180: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48  *c = sk_SSL_CIPH
6190: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b  ER_value(sk, i);
61a0: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c  ...if (c == NULL
61b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f  ) continue;..../
61c0: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69  * textual descri
61d0: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70  ption of the cip
61e0: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c  her */...if (SSL
61f0: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
6200: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65  ion(c, buf, size
6210: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
6220: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70  ) {...    Tcl_Ap
6230: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72  pendToObj(objPtr
6240: 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 72  , buf, (int) str
6250: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65  len(buf));...} e
6260: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  lse {...    Tcl_
6270: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50  AppendToObj(objP
6280: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c  tr, "UNKNOWN\n",
6290: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a   8);...}..    }.
62a0: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70  .}..if (use_supp
62b0: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b  orted) {..    sk
62c0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65  _SSL_CIPHER_free
62d0: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  (sk);..}.    }. 
62e0: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29     SSL_free(ssl)
62f0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ;.    SSL_CTX_fr
6300: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63  ee(ctx);..    Tc
6310: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6320: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
6330: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
6340: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
6350: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
6360: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
63b0: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20  ProtocolsObjCmd 
63c0: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
63d0: 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20  e protocols. *. 
63e0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
63f0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
6400: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
6410: 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d  :protocols" comm
6420: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61  and. *.to list a
6430: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f  vailable protoco
6440: 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ls.. *. * Result
6450: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
6460: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74   Tcl result list
6470: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
6480: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ects:. *.none. *
6490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
64e0: 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f  c int.ProtocolsO
64f0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
6500: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
6510: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6520: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
6530: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
6540: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
6550: 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70  *objPtr;..    dp
6560: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6570: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
6580: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 1) {..Tcl_Wron
6590: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
65a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09   1, objv, "");..
65b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
65c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a  ;.    }..    obj
65d0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
65e0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
65f0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
6600: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
6610: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
6620: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
6630: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
6640: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54  L_NO_SSL2).    T
6650: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6660: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6670: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
6680: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
6690: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31  ls[TLS_SSL2], -1
66a0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
66b0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
66c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
66d0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
66e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
66f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6700: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
6710: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
6720: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c  ocols[TLS_SSL3],
6730: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
6740: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
6750: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
6760: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
6770: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6780: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6790: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
67a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
67b0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
67c0: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#endif
67d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
67e0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
67f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
6800: 54 4c 53 31 5f 31 29 0a 20 20 20 20 54 63 6c 5f  TLS1_1).    Tcl_
6810: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6820: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
6830: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
6840: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
6850: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29  TLS_TLS1_1], -1)
6860: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
6870: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
6880: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
6890: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
68a0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
68b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
68c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
68d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
68e0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
68f0: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_2], -1));.#end
6900: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
6910: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
6920: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6930: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63  O_TLS1_3).    Tc
6940: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6950: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
6960: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
6970: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
6980: 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d  s[TLS_TLS1_3], -
6990: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  1));.#endif..   
69a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
69b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
69c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
69d0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
69e0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
69f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6a40: 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43   * HandshakeObjC
6a50: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
6a60: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
6a70: 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68   to verify wheth
6a80: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  er the handshake
6a90: 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09   is complete. *.
6aa0: 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65  or not.. *. * Re
6ab0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
6ac0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
6ad0: 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61   1 means handsha
6ae0: 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d  ke complete, 0 m
6af0: 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a  eans pending.. *
6b00: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6b10: 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53  :. *.May force S
6b20: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74  SL negotiation t
6b30: 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a  o take place.. *
6b40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
6b90: 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f  c int HandshakeO
6ba0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
6bb0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
6bc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6bd0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
6be0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
6bf0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
6c00: 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20  nel chan;       
6c10: 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20   /* The channel 
6c20: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
6c30: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
6c40: 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20  statePtr;       
6c50: 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65   /* client state
6c60: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
6c70: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
6c80: 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c  r *errStr = NULL
6c90: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20  ;.    int ret = 
6ca0: 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  1;.    int err =
6cb0: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
6cc0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
6cd0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
6ce0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
6cf0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
6d00: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
6d10: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
6d20: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
6d30: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
6d40: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
6d50: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6d60: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c  bj(objv[1], NULL
6d70: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
6d80: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
6d90: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
6da0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
6db0: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  R);.    }..    /
6dc0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
6dd0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
6de0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
6df0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
6e00: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
6e10: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
6e20: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
6e30: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
6e40: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
6e50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6e60: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
6e70: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
6e80: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
6e90: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54  n), "\": not a T
6ea0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
6eb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  L);..return(TCL_
6ec0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20  ERROR);.    }.  
6ed0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
6ee0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
6ef0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
6f00: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72  (chan);..    dpr
6f10: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
6f20: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
6f30: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c  ");.    ret = Tl
6f40: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
6f50: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c  (statePtr, &err,
6f60: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66   1);.    dprintf
6f70: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
6f80: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25  nect returned: %
6f90: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69  i", ret);..    i
6fa0: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28  f (ret < 0 && ((
6fb0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
6fc0: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29  & TLS_TCL_ASYNC)
6fd0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41   && (err == EAGA
6fe0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  IN))) {..dprintf
6ff0: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20  ("Async set and 
7000: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a  err = EAGAIN");.
7010: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20  .ret = 0;.    } 
7020: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30  else if (ret < 0
7030: 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  ) {..errStr = st
7040: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
7050: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
7060: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
7070: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
7080: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
7090: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
70a0: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
70b0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
70c0: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
70d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
70e0: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
70f0: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
7100: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7110: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e  .dprintf("Return
7120: 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69  ing TCL_ERROR wi
7130: 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69  th handshake fai
7140: 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72  led: %s", errStr
7150: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
7160: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73  RROR);.    } els
7170: 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20  e {..if (err != 
7180: 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  0) {..    dprint
7190: 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20  f("Got an error 
71a0: 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64  with a completed
71b0: 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20   handshake: err 
71c0: 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a  = %i", err);..}.
71d0: 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  .ret = 1;.    }.
71e0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
71f0: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77  turning TCL_OK w
7200: 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22  ith data \"%i\""
7210: 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f  , ret);.    Tcl_
7220: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
7230: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
7240: 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65  bj(ret));.    re
7250: 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63  turn(TCL_OK);..c
7260: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
7270: 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ntData;.}../*. *
7280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74  ---. *. * Import
72d0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
72e0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
72f0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
7300: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63  cess the "ssl" c
7310: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65  ommand. *. *.The
7320: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73   ssl command pus
7330: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28  hes SSL over a (
7340: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29  newly connected)
7350: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20   tcp socket. *. 
7360: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
7370: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
7380: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
7390: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
73a0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76  modify the behav
73b0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61  ior of an IO cha
73c0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
73d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d  */.static int.Im
7420: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
7430: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
7440: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
7450: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
7460: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
7470: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
7480: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
7490: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
74a0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
74b0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
74c0: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
74d0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
74e0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
74f0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20  SSL_CTX *ctx.   
7500: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
7510: 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74   Tcl_Obj *script
7520: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7530: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
7540: 73 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d  ssword.        =
7550: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
7560: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e  String upperChan
7570: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  nelTranslation, 
7580: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
7590: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  king, upperChann
75a0: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65  elEncoding, uppe
75b0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b  rChannelEOFChar;
75c0: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65  .    int idx, le
75d0: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
75e0: 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f  ..        = TLS_
75f0: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e  TCL_INIT;.    in
7600: 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20  t server..      
7610: 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e    = 0;./* is con
7620: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67  nection incoming
7630: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f   or outgoing? */
7640: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69  .    char *keyfi
7650: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
7660: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72  L;.    char *cer
7670: 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  tfile.        = 
7680: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e  NULL;.    unsign
7690: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d  ed char *key  .=
76a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b   NULL;.    int k
76b0: 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20  ey_len          
76c0: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20         = 0;.    
76d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
76e0: 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55  ert         = NU
76f0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74  LL;.    int cert
7700: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  _len            
7710: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61      = 0;.    cha
7720: 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20  r *ciphers.     
7730: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
7740: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
7750: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
7760: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ;.    char *CAfi
7770: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
7780: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64  L;.    char *CAd
7790: 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ir..        = NU
77a0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48  LL;.    char *DH
77b0: 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d  params.        =
77c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
77d0: 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20  *model..        
77e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
77f0: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20   *servername.   
7800: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20       = NULL;./* 
7810: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72  hostname for Ser
7820: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74  ver Name Indicat
7830: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
7840: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7850: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c  session_id = NUL
7860: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
7870: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  alpn..= NULL;.  
7880: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20    int ssl2 = 0, 
7890: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ssl3 = 0;.    in
78a0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31  t tls1 = 1, tls1
78b0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d  _1 = 1, tls1_2 =
78c0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a   1, tls1_3 = 1;.
78d0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20      int proto = 
78e0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20  0, level = -1;. 
78f0: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20     int verify = 
7900: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20  0, require = 0, 
7910: 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20  request = 1;..  
7920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
7930: 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53  d");..#if OPENSS
7940: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
7950: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
7960: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
7970: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  SL_NO_SSL2) && !
7980: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
7990: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   && defined(NO_S
79a0: 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28  SL3) && defined(
79b0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69  NO_TLS1) && defi
79c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
79d0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  & defined(NO_TLS
79e0: 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28  1_2) && defined(
79f0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73  NO_TLS1_3).    s
7a00: 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  sl2 = 1;.#endif.
7a10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45  #if !defined(OPE
7a20: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
7a30: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
7a40: 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  3) && defined(NO
7a50: 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65  _SSL2) && define
7a60: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65  d(NO_TLS1) && de
7a70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
7a80: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54   && defined(NO_T
7a90: 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65  LS1_2) && define
7aa0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  d(NO_TLS1_3).   
7ab0: 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69   ssl3 = 1;.#endi
7ac0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
7ad0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7ae0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7af0: 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b  1).    tls1 = 0;
7b00: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
7b10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
7b20: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7b30: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
7b40: 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e   tls1_1 = 0;.#en
7b50: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
7b60: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7b70: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7b80: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73  _TLS1_2).    tls
7b90: 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  1_2 = 0;.#endif.
7ba0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7bb0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
7bc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7bd0: 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20  1_3).    tls1_3 
7be0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
7bf0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b   if (objc < 2) {
7c00: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7c10: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7c20: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70  jv, "channel ?op
7c30: 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72  tions?");..retur
7c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7c50: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
7c60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
7c70: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
7c80: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
7c90: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
7ca0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
7cb0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
7cc0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
7cd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7ce0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
7cf0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
7d00: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
7d10: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
7d20: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
7d30: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
7d40: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69   for (idx = 2; i
7d50: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b  dx < objc; idx++
7d60: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d  ) {..char *opt =
7d70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7d80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c  omObj(objv[idx],
7d90: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70   NULL);...if (op
7da0: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20  t[0] != '-')..  
7db0: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54    break;...OPTST
7dc0: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69  R("-cadir", CAdi
7dd0: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  r);..OPTSTR("-ca
7de0: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a  file", CAfile);.
7df0: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69  .OPTSTR("-certfi
7e00: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a  le", certfile);.
7e10: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
7e20: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
7e30: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c  TSTR("-ciphers",
7e40: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
7e50: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65  TR("-ciphersuite
7e60: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  s", ciphersuites
7e70: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d  );..OPTOBJ("-com
7e80: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
7e90: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61  .OPTSTR("-dhpara
7ea0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a  ms", DHparams);.
7eb0: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c  .OPTSTR("-keyfil
7ec0: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f  e", keyfile);..O
7ed0: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20  PTSTR("-model", 
7ee0: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
7ef0: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
7f00: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
7f10: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
7f20: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uire);..OPTBOOL(
7f30: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
7f40: 65 73 74 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  est);..OPTINT("-
7f50: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20  securitylevel", 
7f60: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
7f70: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
7f80: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
7f90: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
7fa0: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
7fb0: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
7fc0: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
7fd0: 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c  TOBJ("-alpn", al
7fe0: 70 6e 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  pn);..OPTBOOL("-
7ff0: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f  ssl2", ssl2);..O
8000: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20  PTBOOL("-ssl3", 
8010: 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl3);..OPTBOOL(
8020: 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a  "-tls1", tls1);.
8030: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
8040: 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50  1", tls1_1);..OP
8050: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c  TBOOL("-tls1.2",
8060: 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f   tls1_2);..OPTBO
8070: 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c  OL("-tls1.3", tl
8080: 73 31 5f 33 29 3b 0a 09 4f 50 54 42 59 54 45 28  s1_3);..OPTBYTE(
8090: 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63  "-cert", cert, c
80a0: 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 42 59  ert_len);..OPTBY
80b0: 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20  TE("-key", key, 
80c0: 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09 4f 50 54 42  key_len);...OPTB
80d0: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61  AD("option", "-a
80e0: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61  lpn, -cadir, -ca
80f0: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65  file, -cert, -ce
8100: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c  rtfile, -cipher,
8110: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   -ciphersuites, 
8120: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72  -command, -dhpar
8130: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66  ams, -key, -keyf
8140: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
8150: 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 65  ssword, -require
8160: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 63  , -request, -sec
8170: 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72  uritylevel, -ser
8180: 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65  ver, -servername
8190: 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d  , -session_id, -
81a0: 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c  ssl2, -ssl3, -tl
81b0: 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c  s1, -tls1.1, -tl
81c0: 73 31 2e 32 2c 20 6f 72 20 2d 74 6c 73 31 2e 33  s1.2, or -tls1.3
81d0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
81e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
81f0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 20    if (request). 
8200: 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c     verify |= SSL
8210: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
8220: 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59  NCE | SSL_VERIFY
8230: 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72  _PEER;.    if (r
8240: 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72  equest && requir
8250: 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e) verify |= SSL
8260: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
8270: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20  NO_PEER_CERT;.  
8280: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20    if (verify == 
8290: 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f  0).verify = SSL_
82a0: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20  VERIFY_NONE;..  
82b0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32    proto |= (ssl2
82c0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
82d0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
82e0: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53  o |= (ssl3 ? TLS
82f0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29  _PROTO_SSL3 : 0)
8300: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8310: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  tls1 ? TLS_PROTO
8320: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20  _TLS1 : 0);.    
8330: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31  proto |= (tls1_1
8340: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8350: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_1 : 0);.    pr
8360: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f  oto |= (tls1_2 ?
8370: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8380: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8390: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54  o |= (tls1_3 ? T
83a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20  LS_PROTO_TLS1_3 
83b0: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  : 0);..    /* re
83c0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62  set to NULL if b
83d0: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76  lank string prov
83e0: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  ided */.    if (
83f0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09  cert && !*cert).
8400: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20  .        cert.  
8410: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8420: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b    if (key && !*k
8430: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79  ey)..        key
8440: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8450: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
8460: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29  e && !*certfile)
8470: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c           certfil
8480: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  e.= NULL;.    if
8490: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b   (keyfile && !*k
84a0: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65  eyfile)..keyfile
84b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
84c0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
84d0: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20   && !*ciphers). 
84e0: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20         ciphers. 
84f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8500: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69     if (ciphersui
8510: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73  tes && !*ciphers
8520: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69  uites) ciphersui
8530: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20  tes    = NULL;. 
8540: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26     if (CAfile &&
8550: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20   !*CAfile).     
8560: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20     CAfile.      
8570: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
8580: 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 64   (CAdir && !*CAd
8590: 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 69  ir).        CAdi
85a0: 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  r.        = NULL
85b0: 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  ;.    if (DHpara
85c0: 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73  ms && !*DHparams
85d0: 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61  ).        DHpara
85e0: 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  ms        = NULL
85f0: 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53  ;..    /* new SS
8600: 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73  L state */.    s
8610: 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74  tatePtr..= (Stat
8620: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e  e *) ckalloc((un
8630: 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53  signed) sizeof(S
8640: 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73  tate));.    mems
8650: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
8660: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
8670: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
8680: 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20  lags.= flags;.  
8690: 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65    statePtr->inte
86a0: 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp.= interp;.   
86b0: 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67   statePtr->vflag
86c0: 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20  s.= verify;.    
86d0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20  statePtr->err.= 
86e0: 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f  "";..    /* allo
86f0: 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20  cate script */. 
8700: 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b     if (script) {
8710: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
8720: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63  StringFromObj(sc
8730: 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  ript, &len);..if
8740: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
8750: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
8760: 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20   = script;..    
8770: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
8780: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
8790: 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  ack);..}.    }..
87a0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
87b0: 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20  password */.    
87c0: 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a  if (password) {.
87d0: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
87e0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73  tringFromObj(pas
87f0: 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69  sword, &len);..i
8800: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
8810: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
8820: 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20  d = password;.. 
8830: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
8840: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
8850: 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20  ssword);..}.    
8860: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c  }..    if (model
8870: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74   != NULL) {..int
8880: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74   mode;../* Get t
8890: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65  he "model" conte
88a0: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  xt */..chan = Tc
88b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
88c0: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64  erp, model, &mod
88d0: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d  e);..if (chan ==
88e0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
88f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
8900: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
8910: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
8920: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8930: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65  .}.../*.. * Make
8940: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
8950: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
8960: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68  channel.. */..ch
8970: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
8980: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69  hannel(chan);..i
8990: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
89a0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
89b0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
89c0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
89d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
89e0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
89f0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
8a00: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
8a10: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
8a20: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
8a30: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
8a40: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
8a50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
8a60: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78  L_ERROR;..}..ctx
8a70: 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c   = ((State *)Tcl
8a80: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
8a90: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e  nceData(chan))->
8aa0: 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ctx;.    } else 
8ab0: 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54  {..if ((ctx = CT
8ac0: 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c  X_Init(statePtr,
8ad0: 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20   server, proto, 
8ae0: 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c  keyfile, certfil
8af0: 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 0a 09 20  e, key, cert,.. 
8b00: 20 20 20 6b 65 79 5f 6c 65 6e 2c 20 63 65 72 74     key_len, cert
8b10: 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66  _len, CAdir, CAf
8b20: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69  ile, ciphers, ci
8b30: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65  phersuites, leve
8b40: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d  l, DHparams)) ==
8b50: 20 28 53 53 4c 5f 43 54 58 2a 29 30 29 20 7b 0a   (SSL_CTX*)0) {.
8b60: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
8b70: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
8b80: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
8b90: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
8ba0: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
8bb0: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
8bc0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
8bd0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
8be0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
8bf0: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
8c00: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
8c10: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
8c20: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
8c30: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
8c40: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
8c50: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
8c60: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
8c70: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
8c80: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
8c90: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
8ca0: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
8cb0: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
8cc0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
8cd0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
8ce0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
8cf0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
8d00: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
8d10: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
8d20: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
8d30: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
8d40: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
8d50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
8d60: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
8d70: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
8d80: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
8d90: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
8da0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
8db0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
8dc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
8dd0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
8de0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
8df0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
8e00: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
8e10: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
8e20: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
8e30: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
8e40: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
8e50: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
8e60: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
8e70: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
8e80: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
8e90: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
8ea0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
8eb0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
8ec0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
8ed0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
8ee0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
8ef0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
8f00: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
8f10: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
8f20: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
8f30: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
8f40: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
8f50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8f60: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
8f70: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
8f80: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
8f90: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
8fa0: 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61  ype(), (ClientDa
8fb0: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54  ta) statePtr, (T
8fc0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
8fd0: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
8fe0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
8ff0: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
9000: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
9010: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
9020: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
9030: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
9040: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
9050: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9060: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
9070: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
9080: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
9090: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
90a0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
90b0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
90c0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
90d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
90e0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
90f0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9100: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9110: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
9120: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
9130: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9140: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
9150: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9160: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9170: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9180: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
9190: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
91a0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
91b0: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
91c0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
91d0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
91e0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
91f0: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
9200: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
9210: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
9220: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9230: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9240: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9250: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
9260: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9270: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9280: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a  cking));..    /*
9290: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
92a0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
92b0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
92c0: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
92d0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
92e0: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
92f0: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
9300: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
9310: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
9320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
9330: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
9340: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
9350: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
9360: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
9370: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
9380: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
9390: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
93a0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
93b0: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
93c0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
93d0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
93e0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
93f0: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
9400: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74   ClientHello ext
9410: 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 21  ension */..if (!
9420: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68  SSL_set_tlsext_h
9430: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74  ost_name(statePt
9440: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
9450: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20  me) && require) 
9460: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
9470: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9480: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73  "setting TLS hos
9490: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e  t name extension
94a0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
94b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  *) NULL);.      
94c0: 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28        Tls_Free((
94d0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
94e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
94f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9500: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a 20  .        }.../* 
9510: 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65 72  Configure server
9520: 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63 6b   host name check
9530: 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c 69  s in the SSL cli
9540: 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f 73  ent. Set DNS hos
9550: 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61 6d  tname to..   nam
9560: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69  e for peer certi
9570: 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20 53  ficate checks. S
9580: 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61 73  SL_set1_host has
9590: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f   limitations. */
95a0: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f  ..if (!SSL_add1_
95b0: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73  host(statePtr->s
95c0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29  sl, servername))
95d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
95e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
95f0: 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f   "setting DNS ho
9600: 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c  st name failed",
9610: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c 73  .            Tls
9630: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
9640: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20  tatePtr);.      
9650: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9660: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
9670: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
9680: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
9690: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
96a0: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
96b0: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
96c0: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
96d0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
96e0: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
96f0: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
9700: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
9710: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
9720: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
9730: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
9740: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
9750: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
9760: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
9770: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9780: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69  Resume session i
9790: 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  d ", session_id,
97a0: 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61   " failed", (cha
97b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  r *) NULL);.    
97c0: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65          Tls_Free
97d0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
97e0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
97f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9800: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
9810: 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a   if (alpn) {../*
9820: 20 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 6c   Convert a Tcl l
9830: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f  ist into a proto
9840: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65  col-list in wire
9850: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69  -format */..unsi
9860: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
9870: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64  s, *p;..unsigned
9880: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20   int protos_len 
9890: 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e  = 0;..int i, len
98a0: 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20  , cnt;..Tcl_Obj 
98b0: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
98c0: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
98d0: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
98e0: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  n, &cnt, &list) 
98f0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
9900: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
9910: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
9920: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9930: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RROR;..}.../* De
9940: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f  termine the memo
9950: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ry required for 
9960: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
9970: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30  t */..for (i = 0
9980: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
9990: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74  {..    Tcl_GetSt
99a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
99b0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [i], &len);..   
99c0: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20   if (len > 255) 
99d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
99e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 6c  sult(interp, "al
99f0: 70 6e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65  pn protocol name
9a00: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61   too long", (cha
9a10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
9a20: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
9a30: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
9a40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
9a50: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
9a60: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e  s_len += 1 + len
9a70: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
9a80: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
9a90: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
9aa0: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
9ab0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
9ac0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
9ad0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
9ae0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
9af0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
9b00: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70  /..for (i = 0, p
9b10: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63   = protos; i < c
9b20: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
9b30: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
9b40: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9b50: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
9b60: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e  ..    *p++ = len
9b70: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
9b80: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20   str, len);..   
9b90: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
9ba0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
9bb0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
9bc0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
9bd0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
9be0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
9bf0: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
9c00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
9c10: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
9c20: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
9c30: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
9c40: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
9c50: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
9c60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9c70: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
9c80: 64 20 74 6f 20 73 65 74 20 61 6c 70 6e 20 70 72  d to set alpn pr
9c90: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20  otocols", (char 
9ca0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
9cb0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
9cc0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
9cd0: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b   ckfree(protos);
9ce0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
9cf0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
9d00: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20  Store protocols 
9d10: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  list */..statePt
9d20: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74  r->protos = prot
9d30: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  os;..statePtr->p
9d40: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74  rotos_len = prot
9d50: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
9d60: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
9d70: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09  protos = NULL;..
9d80: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
9d90: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  _len = 0;.    }.
9da0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
9db0: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20  SL Callbacks.   
9dc0: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74    */.    SSL_set
9dd0: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50  _app_data(stateP
9de0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
9df0: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70  )statePtr);./* p
9e00: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20  oint back to us 
9e10: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76  */.    SSL_set_v
9e20: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e  erify(statePtr->
9e30: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72  ssl, verify, Ver
9e40: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ifyCallback);.  
9e50: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e    SSL_CTX_set_in
9e60: 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  fo_callback(stat
9e70: 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43  ePtr->ctx, InfoC
9e80: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
9e90: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
9ea0: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
9eb0: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
9ec0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
9ed0: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65  reate Tcl_Channe
9ee0: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f  l BIO Handler */
9ef0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
9f00: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74  _bio.= BIO_new_t
9f10: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f  cl(statePtr, BIO
9f20: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73  _NOCLOSE);.    s
9f30: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42  tatePtr->bio.= B
9f40: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c  IO_new(BIO_f_ssl
9f50: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65  ());..    if (se
9f60: 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76  rver) {../* Serv
9f70: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  er callbacks */.
9f80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70  .SSL_CTX_set_alp
9f90: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
9fa0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
9fb0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
9fc0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
9fd0: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
9fe0: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73  servername_arg(s
9ff0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
a000: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
a010: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
a020: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
a030: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
a040: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62  r->ctx, SNICallb
a050: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ack);..SSL_CTX_s
a060: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
a070: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
a080: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c  , HelloCallback,
a090: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
a0a0: 72 29 3b 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e  r);...statePtr->
a0b0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
a0c0: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65  _SERVER;..SSL_se
a0d0: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73  t_accept_state(s
a0e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
a0f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 53 4c     } else {..SSL
a100: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61  _set_connect_sta
a110: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
a120: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  );.    }.    SSL
a130: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
a140: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
a150: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
a160: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
a170: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
a180: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
a190: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
a1a0: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  LOSE);..    /*. 
a1b0: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c      * End of SSL
a1c0: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20   Init.     */.  
a1d0: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
a1e0: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65  ning %s", Tcl_Ge
a1f0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
a200: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
a210: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
a220: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
a230: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
a240: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
a250: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  elf), TCL_VOLATI
a260: 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  LE);..    return
a270: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
a280: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
a290: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a2e0: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62   *. * UnimportOb
a2f0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
a300: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
a310: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76  invoked to remov
a320: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  e the topmost ch
a330: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a  annel filter.. *
a340: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
a350: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
a360: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
a370: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
a380: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68  y modify the beh
a390: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63  avior of an IO c
a3a0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
a400: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  UnimportObjCmd(C
a410: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
a420: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
a430: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
a440: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
a450: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
a460: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
a470: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
a480: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
a490: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72   on. */..    dpr
a4a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
a4b0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
a4c0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
a4d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a4e0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
a4f0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
a500: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
a510: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
a520: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
a530: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a540: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
a550: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
a560: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
a570: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
a580: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
a590: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
a5a0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
a5b0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
a5c0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
a5d0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
a5e0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69  el(chan);..    i
a5f0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
a600: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
a610: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
a620: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
a630: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
a640: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
a650: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
a660: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
a670: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
a680: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  el", NULL);..ret
a690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a6a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
a6b0: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c  l_UnstackChannel
a6c0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d  (interp, chan) =
a6d0: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
a6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a6f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
a700: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
a710: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
a720: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
a730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a770: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69  --. *. * CTX_Ini
a780: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61  t -- construct a
a790: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
a7a0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  e. *. * Results:
a7b0: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f  . *.A valid SSL_
a7c0: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20  CTX instance or 
a7d0: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  NULL.. *. * Side
a7e0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e   effects:. *.con
a7f0: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74  structs SSL cont
a800: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
a810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a850: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53  --. */.static SS
a860: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74  L_CTX *.CTX_Init
a870: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
a880: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
a890: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
a8a0: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a  *keyfile, char *
a8b0: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e  certfile,.    un
a8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
a8d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
a8e0: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c  *cert, int key_l
a8f0: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e  en, int cert_len
a900: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20  , char *CAdir,. 
a910: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c     char *CAfile,
a920: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20   char *ciphers, 
a930: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
a940: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
a950: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b  har *DHparams) {
a960: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
a970: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
a980: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
a990: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
a9a0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
a9b0: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c  ring ds;.    Tcl
a9c0: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20  _DString ds1;.  
a9d0: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20    int off = 0;. 
a9e0: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
a9f0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
aa00: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
aa10: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
aa20: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
aa30: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
aa40: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
aa50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
aa60: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
aa70: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  elected", NULL);
aa80: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
aa90: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  X *)0;.    }..  
aaa0: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20    /* create SSL 
aab0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f  context */.#if O
aac0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
aad0: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
aae0: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
aaf0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
ab00: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
ab10: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL2).    if (ENA
ab20: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
ab30: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09  PROTO_SSL2)) {..
ab40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ab50: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70  (interp, "SSL2 p
ab60: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
ab70: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
ab80: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
ab90: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  *)0;.    }.#endi
aba0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
abb0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
abc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
abd0: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
abe0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
abf0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63  OTO_SSL3)) {..Tc
ac00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ac10: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f  nterp, "SSL3 pro
ac20: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
ac30: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
ac40: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
ac50: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
ac60: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
ac70: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
ac80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
ac90: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
aca0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
acb0: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f  O_TLS1)) {..Tcl_
acc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
acd0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72  erp, "TLS 1.0 pr
ace0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
acf0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
ad00: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
ad10: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  )0;.    }.#endif
ad20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
ad30: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
ad40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
ad50: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_1).    if (EN
ad60: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
ad70: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20  _PROTO_TLS1_1)) 
ad80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
ad90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
ada0: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.1 protocol no
adb0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
adc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53  LL);..return (SS
add0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d  L_CTX *)0;.    }
ade0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
adf0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
ae00: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
ae10: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
ae20: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
ae30: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
ae40: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_2)) {..Tcl_Ap
ae50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ae60: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74  p, "TLS 1.2 prot
ae70: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
ae80: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
ae90: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
aea0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
aeb0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
aec0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
aed0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
aee0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _3).    if (ENAB
aef0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
af00: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a  ROTO_TLS1_3)) {.
af10: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
af20: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
af30: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .3 protocol not 
af40: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
af50: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f  );..return (SSL_
af60: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23  CTX *)0;.    }.#
af70: 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63  endif..    switc
af80: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20  h (proto) {.#if 
af90: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
afa0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
afb0: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
afc0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
afd0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
afe0: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20  _SSL2).    case 
aff0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a  TLS_PROTO_SSL2:.
b000: 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f  .method = SSLv2_
b010: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
b020: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
b030: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
b040: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
b050: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
b060: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
b070: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
b080: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
b090: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64  TO_SSL3:..method
b0a0: 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28   = SSLv3_method(
b0b0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
b0c0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
b0d0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
b0e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
b0f0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
b100: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b110: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
b120: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
b130: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76  :..method = TLSv
b140: 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  1_method();..bre
b150: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
b160: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
b170: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
b180: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
b190: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
b1a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
b1b0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
b1c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
b1d0: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53  1:..method = TLS
b1e0: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  v1_1_method();..
b1f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
b200: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
b210: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
b220: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
b230: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
b240: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b250: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _2_METHOD).    c
b260: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
b270: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_2:..method = 
b280: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29  TLSv1_2_method()
b290: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
b2a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
b2b0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
b2c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
b2d0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65  TLS1_3).    case
b2e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
b2f0: 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 76  3:../*.. * The v
b300: 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 20  ersion range is 
b310: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c 6f  constrained belo
b320: 77 2c 0a 09 20 2a 20 61 66 74 65 72 20 74 68 65  w,.. * after the
b330: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61   context is crea
b340: 74 65 64 2e 20 20 55 73 65 20 74 68 65 0a 09 20  ted.  Use the.. 
b350: 2a 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64  * generic method
b360: 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09 6d 65 74   here... */..met
b370: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64  hod = TLS_method
b380: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
b390: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
b3a0: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
b3b0: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
b3c0: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
b3d0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53  */..method = TLS
b3e0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f  _method();.#if O
b3f0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
b400: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
b410: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
b420: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
b430: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
b440: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL2)..off |= (E
b450: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
b460: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20  S_PROTO_SSL2)   
b470: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
b480: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv2);.#endif.#
b490: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
b4a0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
b4b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
b4c0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
b4d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
b4e0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20  OTO_SSL3)   ? 0 
b4f0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
b500: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  3);.#endif.#if !
b510: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
b520: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
b530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f  NSSL_NO_TLS1)..o
b540: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
b550: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
b560: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53  TLS1)   ? 0 : SS
b570: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a  L_OP_NO_TLSv1);.
b580: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
b590: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
b5a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
b5b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f  SL_NO_TLS1_1)..o
b5c0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
b5d0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
b5e0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53  TLS1_1) ? 0 : SS
b5f0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29  L_OP_NO_TLSv1_1)
b600: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
b610: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
b620: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
b630: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
b640: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
b650: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
b660: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20  O_TLS1_2) ? 0 : 
b670: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
b680: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
b690: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
b6a0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
b6b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
b6c0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
b6d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
b6e0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20  OTO_TLS1_3) ? 0 
b6f0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
b700: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72  1_3);.#endif..br
b710: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b720: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
b730: 77 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20 20 20  w(method);..    
b740: 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74  if (!ctx) {..ret
b750: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  urn(NULL);.    }
b760: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76  ..    if (getenv
b770: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29  (SSLKEYLOGFILE))
b780: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
b790: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28  keylog_callback(
b7a0: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  ctx, KeyLogCallb
b7b0: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ack);.    }..#if
b7c0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
b7d0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
b7e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
b7f0: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74  _3).    if (prot
b800: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  o == TLS_PROTO_T
b810: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54  LS1_3) {..SSL_CT
b820: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
b830: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
b840: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53  1_3_VERSION);..S
b850: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
b860: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
b870: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
b880: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
b890: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69  .    /* Force ci
b8a0: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f  pher selection o
b8b0: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a  rder by server *
b8c0: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72  /.    if (!isSer
b8d0: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ver) {..SSL_CTX_
b8e0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
b8f0: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53   SSL_OP_CIPHER_S
b900: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45  ERVER_PREFERENCE
b910: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53  );.    }..    SS
b920: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61  L_CTX_set_app_da
b930: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69  ta(ctx, (void*)i
b940: 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d  nterp);./* remem
b950: 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  ber the interpre
b960: 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ter */.    SSL_C
b970: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
b980: 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b  tx, SSL_OP_ALL);
b990: 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20  ./* all SSL bug 
b9a0: 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20  workarounds */. 
b9b0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f     SSL_CTX_set_o
b9c0: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29  ptions(ctx, off)
b9d0: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72  ;../* disable pr
b9e0: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20  otocol versions 
b9f0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
ba00: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
ba10: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20  0x10101000L.    
ba20: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65  SSL_CTX_set_mode
ba30: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ctx, SSL_MODE_A
ba40: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68  UTO_RETRY);./* h
ba50: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68  andle new handsh
ba60: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75  akes in backgrou
ba70: 6e 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nd */.#endif.   
ba80: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65   SSL_CTX_sess_se
ba90: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78  t_cache_size(ctx
baa0: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20  , 128);..    /* 
bab0: 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64  Set user defined
bac0: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
bad0: 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63   suites, and sec
bae0: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20  urity level */. 
baf0: 20 20 20 69 66 20 28 28 28 63 69 70 68 65 72 73     if (((ciphers
bb00: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
bb10: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
bb20: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65  _list(ctx, ciphe
bb30: 72 73 29 29 20 7c 7c 20 5c 0a 09 28 28 63 69 70  rs)) || \..((cip
bb40: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
bb50: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
bb60: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
bb70: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
bb80: 73 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  s))) {..    Tcl_
bb90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bba0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
bbb0: 73 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72  s failed", (char
bbc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
bbd0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
bbe0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
bbf0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20  SSL_CTX *)0;.   
bc00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73   }..    /* Set s
bc10: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
bc20: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e  .    if (level >
bc30: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36   -1 && level < 6
bc40: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
bc50: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a  security_level *
bc60: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
bc70: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74  ecurity_level(ct
bc80: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  x, level);.    }
bc90: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
bca0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
bcb0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
bcc0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
bcd0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
bce0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
bcf0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
bd00: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
bd10: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
bd20: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  )statePtr);..   
bd30: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69   /* read a Diffi
bd40: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65  e-Hellman parame
bd50: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73  ters file, or us
bd60: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f  e the built-in o
bd70: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45  ne */.#ifdef OPE
bd80: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69  NSSL_NO_DH.    i
bd90: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
bda0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
bdb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bdc0: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73   "DH parameter s
bdd0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c  upport not avail
bde0: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  able", (char *) 
bdf0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
be00: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
be10: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
be20: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
be30: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20   {..DH* dh;..if 
be40: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
be50: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62  L) {..    BIO *b
be60: 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  io;..    Tcl_DSt
be70: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09  ringInit(&ds);..
be80: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65      bio = BIO_ne
be90: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72  w_file(F2N(DHpar
bea0: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b  ams, &ds), "r");
beb0: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20  ..    if (!bio) 
bec0: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
bed0: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f  ree(&ds);...Tcl_
bee0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bef0: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
bf00: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65  find DH paramete
bf10: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  rs file", (char 
bf20: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
bf30: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
bf40: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58  .return (SSL_CTX
bf50: 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20   *)0;..    }... 
bf60: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
bf70: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
bf80: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
bf90: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
bfa0: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
bfb0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
bfc0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
bfd0: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
bfe0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bff0: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
c000: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
c010: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
c020: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
c030: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
c040: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58  .return (SSL_CTX
c050: 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 20   *)0;..    }..} 
c060: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d  else {..    dh =
c070: 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b   get_dhParams();
c080: 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ..}..SSL_CTX_set
c090: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
c0a0: 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a  ;..DH_free(dh);.
c0b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
c0c0: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72    /* set our cer
c0d0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20  tificate */.    
c0e0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
c0f0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65   = 0;.    if (ce
c100: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  rtfile != NULL) 
c110: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
c120: 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44  key = 1;...Tcl_D
c130: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
c140: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
c150: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
c160: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72  ile(ctx, F2N(cer
c170: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  tfile, &ds), SSL
c180: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
c190: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
c1a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
c1b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
c1c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c1d0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
c1e0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
c1f0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
c200: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
c210: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
c220: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
c230: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
c240: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54    return (SSL_CT
c250: 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20  X *)0;..}.    } 
c260: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d  else if (cert !=
c270: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
c280: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
c290: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
c2a0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e  _certificate_ASN
c2b0: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c  1(ctx, cert_len,
c2c0: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09   cert) <= 0) {..
c2d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
c2e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
c2f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c300: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
c310: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
c320: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52  te: ",....     R
c330: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
c340: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
c350: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
c360: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53  ..    return (SS
c370: 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20  L_CTX *)0;..}.  
c380: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74    } else {..cert
c390: 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35  file = (char*)X5
c3a0: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63  09_get_default_c
c3b0: 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66  ert_file();...if
c3c0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
c3d0: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
c3e0: 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53  tx, certfile, SS
c3f0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
c400: 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20  <= 0) {.#if 0.. 
c410: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
c420: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
c430: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c440: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
c450: 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65  o use default ce
c460: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22  rtificate file "
c470: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22  , certfile, ": "
c480: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e  ,....     REASON
c490: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
c4a0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
c4b0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
c4c0: 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58   return (SSL_CTX
c4d0: 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a   *)0;.#endif..}.
c4e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
c4f0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
c500: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
c510: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
c520: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
c530: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
c540: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
c550: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
c560: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
c570: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
c580: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
c590: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
c5a0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
c5b0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
c5c0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
c5d0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
c5e0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
c5f0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
c600: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
c610: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
c620: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
c630: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
c640: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
c650: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
c660: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
c670: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
c680: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
c690: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
c6a0: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
c6b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
c6c0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
c6d0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c6e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
c6f0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
c700: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
c710: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20  file, " ",....  
c720: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c         REASON(),
c730: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
c740: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
c750: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28  ctx);...return (
c760: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20  SSL_CTX *)0;..  
c770: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
c780: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
c790: 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20  .} else if (key 
c7a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c7b0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
c7c0: 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28  PrivateKey_ASN1(
c7d0: 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74  EVP_PKEY_RSA, ct
c7e0: 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20  x, key,key_len) 
c7f0: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53  <= 0) {...Tcl_DS
c800: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
c810: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
c820: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
c830: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
c840: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
c850: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
c860: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
c870: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
c880: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c890: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
c8a0: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20  set public key: 
c8b0: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
c8c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
c8d0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
c8e0: 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f  ;...return (SSL_
c8f0: 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a  CTX *)0;..    }.
c900: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
c910: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
c920: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
c930: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
c940: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
c950: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
c960: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
c970: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
c980: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c990: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
c9a0: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
c9b0: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
c9c0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
c9d0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
c9e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
c9f0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
ca00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
ca10: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a  SSL_CTX *)0;..}.
ca20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
ca30: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43  t verification C
ca40: 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  As */.    Tcl_DS
ca50: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
ca60: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
ca70: 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 69  nit(&ds1);.    i
ca80: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
ca90: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
caa0: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
cab0: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64  e, &ds), F2N(CAd
cac0: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21  ir, &ds1)) ||..!
cad0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
cae0: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73  ult_verify_paths
caf0: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09  (ctx)) {.#if 0..
cb00: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
cb10: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  &ds);..Tcl_DStri
cb20: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f  ngFree(&ds1);../
cb30: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c  * Don't currentl
cb40: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66  y care if this f
cb50: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  ails */..Tcl_App
cb60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
cb70: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76  , "SSL default v
cb80: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20  erify paths: ", 
cb90: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
cba0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
cbb0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
cbc0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
cbd0: 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  )0;.#endif.    }
cbe0: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f  ..    /* https:/
cbf0: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  /sourceforge.net
cc00: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20  /p/tls/bugs/57/ 
cc10: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f  */.    /* XXX:TO
cc20: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72  DO: Let the user
cc30: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68   supply values h
cc40: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ere instead of s
cc50: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78  omething that ex
cc60: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ists on the file
cc70: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66  system */.    if
cc80: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
cc90: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35  ) {..STACK_OF(X5
cca0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
ccb0: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
ccc0: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
ccd0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
cce0: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20  ..if (certNames 
ccf0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
cd00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
cd10: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
cd20: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20  certNames);..}. 
cd30: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
cd40: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
cd50: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
cd60: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
cd70: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
cd80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
cdd0: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
cde0: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
cdf0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
ce00: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
ce10: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
ce20: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
ce30: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
ce40: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce90: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
cea0: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
ceb0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
cec0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
ced0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
cee0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
cef0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
cf00: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
cf10: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
cf20: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
cf30: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
cf40: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
cf50: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
cf60: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
cf70: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
cf80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
cf90: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
cfa0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
cfb0: 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 65 65  n;.    char *pee
cfc0: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
cfd0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
cfe0: 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63  ed");..    switc
cff0: 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65  h (objc) {..case
d000: 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c   2:..    channel
d010: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
d020: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
d030: 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  [1], NULL);..   
d040: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33   break;...case 3
d050: 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63  :..    if (!strc
d060: 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  mp (Tcl_GetStrin
d070: 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  g (objv[1]), "-l
d080: 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e  ocal")) {...chan
d090: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
d0a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
d0b0: 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09  bjv[2], NULL);..
d0c0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09  .break;..    }..
d0d0: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
d0e0: 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a  -through ... */.
d0f0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e  #if defined(__GN
d100: 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74  UC__)..    __att
d110: 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68  ribute__((fallth
d120: 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a  rough));.#endif.
d130: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54  .default:..    T
d140: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d150: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
d160: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e   "?-local? chann
d170: 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72  el");..    retur
d180: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d190: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
d1a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
d1b0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  terp, channelNam
d1c0: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  e, &mode);.    i
d1d0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
d1e0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
d1f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d200: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  OR;.    }.    /*
d210: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
d220: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
d230: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
d240: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
d250: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
d260: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
d270: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
d280: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
d290: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
d2a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d2b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
d2c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
d2d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
d2e0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
d2f0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
d300: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
d310: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d320: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
d330: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
d340: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
d350: 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  a(chan);.    if 
d360: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70  (objc == 2) {..p
d370: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  eer = SSL_get_pe
d380: 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  er_certificate(s
d390: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
d3a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65     } else {..pee
d3b0: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74  r = SSL_get_cert
d3c0: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
d3d0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
d3e0: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
d3f0: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
d400: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
d410: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
d420: 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 65  == 2) { X509_fre
d430: 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d  e(peer); }.    }
d440: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
d450: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
d460: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
d470: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65  ..    /* Peer ce
d480: 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74  rt chain (client
d490: 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54   only) */.    ST
d4a0: 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73  ACK_OF(X509)* ss
d4b0: 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65  l_certs = SSL_ge
d4c0: 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69  t_peer_cert_chai
d4d0: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
d4e0: 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72 20  ;.    if (!peer 
d4f0: 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d  && (ssl_certs ==
d500: 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39   NULL || sk_X509
d510: 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 20  _num(ssl_certs) 
d520: 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e  == 0)) {..return
d530: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d540: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e  }..    /* Peer n
d550: 61 6d 65 20 66 72 6f 6d 20 63 65 72 74 20 2a 2f  ame from cert */
d560: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 74  .    if (SSL_get
d570: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
d580: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 3d 3d  tatePtr->ssl) ==
d590: 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 70   X509_V_OK) {..p
d5a0: 65 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65  eername = SSL_ge
d5b0: 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
d5c0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
d5d0: 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
d5e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
d5f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
d600: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
d610: 22 70 65 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29  "peername", -1))
d620: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
d630: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
d640: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
d650: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
d660: 70 65 65 72 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  peername, -1));.
d670: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
d680: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
d690: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
d6a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
d6b0: 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20  sbits", -1));.  
d6c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
d6d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
d6e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
d6f0: 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74  ewIntObj(SSL_get
d700: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61  _cipher_bits(sta
d710: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c  tePtr->ssl, NULL
d720: 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  )));..    cipher
d730: 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
d740: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
d750: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66  tr->ssl);.    if
d760: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55   ((ciphers != NU
d770: 4c 4c 29 20 26 26 20 28 73 74 72 63 6d 70 28 63  LL) && (strcmp(c
d780: 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22  iphers, "(NONE)"
d790: 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f  ) != 0)) {..Tcl_
d7a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
d7b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
d7c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
d7d0: 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20  ngObj("cipher", 
d7e0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
d7f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
d800: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
d810: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
d820: 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28  (SSL_get_cipher(
d830: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
d840: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  -1));.    }..   
d850: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58   /* Verify the X
d860: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
d870: 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65  presented by the
d880: 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c   peer */.    Tcl
d890: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d8a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
d8b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
d8c0: 69 6e 67 4f 62 6a 28 22 76 61 6c 69 64 61 74 69  ingObj("validati
d8d0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  on", -1));.    i
d8e0: 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  f (SSL_get_verif
d8f0: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
d900: 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f  r->ssl) != X509_
d910: 56 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 70 72 6f 74  V_OK) {../* prot
d920: 6f 20 3d 20 22 66 61 69 6c 65 64 22 3b 20 2a 2f  o = "failed"; */
d930: 0a 09 70 72 6f 74 6f 20 3d 20 52 45 41 53 4f 4e  ..proto = REASON
d940: 28 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ();.    } else {
d950: 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 6b 22 3b 0a  ..proto = "ok";.
d960: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
d970: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
d980: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
d990: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
d9a0: 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b  Obj(proto, -1));
d9b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
d9c0: 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
d9d0: 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
d9e0: 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
d9f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
da00: 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
da10: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
da20: 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
da30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
da40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
da50: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
da60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
da70: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  alpn", -1));.   
da80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
da90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
daa0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
dab0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
dac0: 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c   *)proto, (int)l
dad0: 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en));.    Tcl_Li
dae0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
daf0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
db00: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
db10: 4f 62 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d  Obj("version", -
db20: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
db30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
db40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
db50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
db60: 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  bj(SSL_get_versi
db70: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
db80: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ), -1));..    Tc
db90: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
dba0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
dbb0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
dbc0: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
dbd0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
dbe0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
dbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
dc30: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62  ConnectionInfoOb
dc40: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
dc50: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66  onnection info f
dc60: 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
dc70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
dc80: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74   list of connect
dc90: 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d  ion info.  *. *-
dca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dce0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
dcf0: 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  nt ConnectionInf
dd00: 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  oObjCmd(ClientDa
dd10: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
dd20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
dd30: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
dd40: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
dd50: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
dd60: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
dd70: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
dd80: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
dd90: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
dda0: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
ddb0: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
ddc0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  ocket */.    Tcl
ddd0: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
dde0: 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c    const SSL *ssl
ddf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
de00: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a  CIPHER *cipher;.
de10: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45      const SSL_SE
de20: 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a  SSION *session;.
de30: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
de40: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a  ed char *proto;.
de50: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
de60: 20 6c 65 6e 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d   len;.    long m
de70: 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  ode;..    if (ob
de80: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
de90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
dea0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
deb0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
dec0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
ded0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
dee0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
def0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
df00: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
df10: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c  [1], NULL), NULL
df20: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
df30: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
df40: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
df50: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
df60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
df70: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
df80: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
df90: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
dfa0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
dfb0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
dfc0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
dfd0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
dfe0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
dff0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
e000: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e010: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
e020: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
e030: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22  lName(chan), "\"
e040: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
e050: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  nel", NULL);..re
e060: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
e070: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
e080: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
e090: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
e0a0: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
e0b0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
e0c0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
e0d0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
e0e0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
e0f0: 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
e100: 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
e110: 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
e120: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
e130: 73 74 61 74 65 3b 0a 0a 09 2f 2a 20 63 6f 6e 6e  state;.../* conn
e140: 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a  ection state */.
e150: 09 69 66 20 28 53 53 4c 5f 69 73 5f 69 6e 69 74  .if (SSL_is_init
e160: 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 29 20  _finished(ssl)) 
e170: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 3d 20 22  {..    state = "
e180: 65 73 74 61 62 6c 69 73 68 65 64 22 3b 0a 09 7d  established";..}
e190: 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 69 6e   else if (SSL_in
e1a0: 5f 69 6e 69 74 28 73 73 6c 29 29 20 7b 0a 09 20  _init(ssl)) {.. 
e1b0: 20 20 20 73 74 61 74 65 20 3d 20 22 68 61 6e 64     state = "hand
e1c0: 73 68 61 6b 65 22 3b 0a 09 7d 20 65 6c 73 65 20  shake";..} else 
e1d0: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 3d 20 22  {..    state = "
e1e0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 22 3b 0a 09  initializing";..
e1f0: 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  }..Tcl_ListObjAp
e200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e210: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e220: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74  NewStringObj("st
e230: 61 74 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ate", -1));..Tcl
e240: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e250: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e260: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e270: 69 6e 67 4f 62 6a 28 73 74 61 74 65 2c 20 2d 31  ingObj(state, -1
e280: 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 72  ));.../* Get ser
e290: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c  ver name */..Tcl
e2a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e2b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e2c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e2d0: 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61  ingObj("serverna
e2e0: 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  me", -1));..Tcl_
e2f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e300: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e310: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e320: 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65  ngObj(SSL_get_se
e330: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
e340: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
e350: 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a  st_name), -1));.
e360: 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f  ../* Get protoco
e370: 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  l */..Tcl_ListOb
e380: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
e390: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
e3a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e3b0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29  "protocol", -1))
e3c0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
e3d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e3e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e3f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
e400: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c  _get_version(ssl
e410: 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65  ), -1));.../* Re
e420: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f  negotiation allo
e430: 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  wed */..Tcl_List
e440: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e450: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e460: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e470: 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e  j("renegotiation
e480: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
e490: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e4a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e4b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e4c0: 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65  Obj(..    SSL_ge
e4d0: 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74  t_secure_renegot
e4e0: 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73  iation_support(s
e4f0: 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64  sl) ? "supported
e500: 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74  " : "not support
e510: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  ed", -1));.../* 
e520: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
e530: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
e540: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
e550: 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e  ALPN negotiation
e560: 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c   */..SSL_get0_al
e570: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 73 6c 2c  pn_selected(ssl,
e580: 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a   &proto, &len);.
e590: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
e5a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
e5b0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
e5c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
e5d0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
e5e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e5f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e600: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e610: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74  Obj((char *)prot
e620: 6f 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 0a  o, (int)len));..
e630: 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79  ./* Get security
e640: 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c   level */..Tcl_L
e650: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e660: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
e670: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
e680: 67 4f 62 6a 28 22 73 65 63 75 72 69 74 79 6c 65  gObj("securityle
e690: 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  vel", -1));..Tcl
e6a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e6b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e6c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
e6d0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 63 75  Obj(SSL_get_secu
e6e0: 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29  rity_level(ssl))
e6f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e700: 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a   Cipher info */.
e710: 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c      cipher = SSL
e720: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70  _get_current_cip
e730: 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  her(ssl);.    if
e740: 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c   (cipher != NULL
e750: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
e760: 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e  FSIZ] = {0};..in
e770: 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73  t bits, alg_bits
e780: 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
e790: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
e7a0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
e7b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
e7c0: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  ipher", -1));..T
e7d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e7e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e7f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e800: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50  tringObj(SSL_CIP
e810: 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
e820: 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her), -1));..Tcl
e830: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e840: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
e850: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
e860: 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64  ingObj("standard
e870: 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54  _name", -1));..T
e880: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e890: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
e8a0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
e8b0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50  tringObj(SSL_CIP
e8c0: 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d  HER_standard_nam
e8d0: 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b  e(cipher), -1));
e8e0: 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49  ...bits = SSL_CI
e8f0: 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69  PHER_get_bits(ci
e900: 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29  pher, &alg_bits)
e910: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
e920: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e930: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e940: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 69  NewStringObj("bi
e950: 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ts", -1));..Tcl_
e960: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e970: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e980: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
e990: 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f  bj(bits));..Tcl_
e9a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e9b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e9c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e9d0: 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69  ngObj("secret_bi
e9e0: 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ts", -1));..Tcl_
e9f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ea00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
ea10: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
ea20: 62 6a 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09  bj(alg_bits));..
ea30: 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61  /* alg_bits is a
ea40: 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74  ctual key secret
ea50: 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69   bits. If use bi
ea60: 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61  ts and secret (a
ea70: 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64  lgorithm) bits d
ea80: 69 66 66 65 72 2c 0a 20 20 20 20 20 20 20 20 20  iffer,.         
ea90: 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68    the rest of th
eaa0: 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64  e bits are fixed
eab0: 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74  , i.e. for limit
eac0: 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72  ed export cipher
ead0: 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f  s (bits < 56) */
eae0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
eaf0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
eb00: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
eb10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e  ewStringObj("min
eb20: 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  _version", -1));
eb30: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
eb40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
eb50: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
eb60: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
eb70: 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69  CIPHER_get_versi
eb80: 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29  on(cipher), -1))
eb90: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  ;...if (SSL_CIPH
eba0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
ebb0: 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
ebc0: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
ebd0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
ebe0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ebf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
ec00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ec10: 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22  bj("description"
ec20: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c  , -1));..    Tcl
ec30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ec40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ec50: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ec60: 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29  ingObj(buf, -1))
ec70: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
ec80: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
ec90: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d  */.    session =
eca0: 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e   SSL_get_session
ecb0: 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73  (ssl);.    if (s
ecc0: 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20  ession != NULL) 
ecd0: 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  {..const unsigne
ece0: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
ecf0: 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 63  .size_t len2;..c
ed00: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
ed10: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
ed20: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66  ../* Session inf
ed30: 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  o */..Tcl_ListOb
ed40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ed50: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
ed60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
ed70: 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
ed80: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
ed90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
eda0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
edb0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
edc0: 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73  SSL_session_reus
edd0: 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20  ed(ssl)));.../* 
ede0: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 54  Session id */..T
edf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ee00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ee10: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
ee20: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
ee30: 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 73 65  n_id", -1));..se
ee40: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
ee50: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
ee60: 73 73 69 6f 6e 2c 20 26 6c 65 6e 29 3b 0a 09 54  ssion, &len);..T
ee70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ee80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ee90: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
eea0: 74 72 69 6e 67 4f 62 6a 28 73 65 73 73 69 6f 6e  tringObj(session
eeb0: 5f 69 64 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b  _id, (int)len));
eec0: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
eed0: 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e  cket - client on
eee0: 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ly */..SSL_SESSI
eef0: 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
ef00: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
ef10: 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69   &len2);..Tcl_Li
ef20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ef30: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ef40: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ef50: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63  Obj("session_tic
ef60: 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ket", -1));..Tcl
ef70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ef80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
ef90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
efa0: 69 6e 67 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  ingObj(ticket, (
efb0: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f  int) len2));.../
efc0: 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73  * Resumable sess
efd0: 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  ion */..Tcl_List
efe0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
eff0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f000: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f010: 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d  j("resumable", -
f020: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f030: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f040: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f050: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
f060: 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75  _SESSION_is_resu
f070: 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29  mable(session)))
f080: 3b 0a 0a 09 2f 2a 20 53 74 61 72 74 20 74 69 6d  ;.../* Start tim
f090: 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  e */..Tcl_ListOb
f0a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f0b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f0c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f0d0: 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31  "start_time", -1
f0e0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
f0f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f100: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f110: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c  l_NewLongObj(SSL
f120: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
f130: 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09  e(session)));...
f140: 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
f150: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
f160: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f170: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
f180: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f190: 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a  timeout", -1));.
f1a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f1b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f1c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f1d0: 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53  wLongObj(SSL_SES
f1e0: 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
f1f0: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 20 20 20  (session)));.   
f200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
f210: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
f220: 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
f230: 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
f240: 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
f250: 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
f260: 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
f270: 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
f280: 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
f290: 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
f2a0: 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
f2b0: 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
f2c0: 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  sl);...Tcl_ListO
f2d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f2e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f2f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f300: 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20  ("compression", 
f310: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
f320: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f330: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f340: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f350: 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50  (comp ? SSL_COMP
f360: 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
f370: 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  : "NONE", -1));.
f380: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f390: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f3a0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f3b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61  wStringObj("expa
f3c0: 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  nsion", -1));..T
f3d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f3e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f3f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
f400: 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20  tringObj(expn ? 
f410: 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
f420: 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22  e(expn) : "NONE"
f430: 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54  , -1));.#else..T
f440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f460: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
f470: 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65  tringObj("compre
f480: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  ssion", -1));..T
f490: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f4a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f4b0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
f4c0: 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c  tringObj("NONE",
f4d0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
f4e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f4f0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f500: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f510: 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d  j("expansion", -
f520: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f530: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f540: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f550: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f560: 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65  "NONE", -1));.#e
f570: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
f580: 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
f590: 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c  /.    mode = SSL
f5a0: 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e  _CTX_get_session
f5b0: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74  _cache_mode(stat
f5c0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
f5d0: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
f5e0: 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
f5f0: 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66 22 3b  ..proto = "off";
f600: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
f610: 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
f620: 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
f630: 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65 6e 74  .proto = "client
f640: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
f650: 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
f660: 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
f670: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65 72 76  {..proto = "serv
f680: 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  er";.    } else 
f690: 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
f6a0: 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20  ESS_CACHE_BOTH) 
f6b0: 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f 74 68  {..proto = "both
f6c0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
f6d0: 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e 6f 77  .proto = "unknow
f6e0: 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  n";.    }.    Tc
f6f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f700: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f710: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f720: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
f730: 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d 31  _cache_mode", -1
f740: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f750: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f760: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f770: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f780: 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b 0a 0a  j(proto, -1));..
f790: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
f7a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
f7b0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
f7c0: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
f7d0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
f7e0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
f7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
f830: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a   *. * VersionObj
f840: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65  Cmd -- return ve
f850: 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f  rsion string fro
f860: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
f870: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
f880: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
f890: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
f8a0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
f8b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
f8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
f900: 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e  atic int.Version
f910: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
f920: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
f930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f940: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
f950: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
f960: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ]) {.    Tcl_Obj
f970: 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64   *objPtr;..    d
f980: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
f990: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
f9a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f9b0: 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
f9c0: 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20  _TEXT, -1);.    
f9d0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
f9e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
f9f0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
fa00: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
fa10: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
fa20: 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f  .objc = objc;..o
fa30: 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a  bjv = objv;.}...
fa40: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
fa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d  --------. *. * M
fa90: 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73  iscObjCmd -- mis
faa0: 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  c commands. *. *
fab0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
fac0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
fad0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
fae0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
faf0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
fb40: 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a  atic int.MiscObj
fb50: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
fb60: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
fb70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
fb80: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
fb90: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
fba0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
fbb0: 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64  st char *command
fbc0: 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20  s [] = { "req", 
fbd0: 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d  "strreq", NULL }
fbe0: 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61  ;.    enum comma
fbf0: 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54  nd { C_REQ, C_ST
fc00: 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b  RREQ, C_DUMMY };
fc10: 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73  .    int cmd, is
fc20: 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75  Str;.    char bu
fc30: 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20  ffer[16384];..  
fc40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
fc50: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
fc60: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
fc70: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fc80: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75  rp, 1, objv, "su
fc90: 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22  bcommand ?args?"
fca0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
fcb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
fcc0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
fcd0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
fce0: 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64  objv[1], command
fcf0: 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  s, "command", 0,
fd00: 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  &cmd) != TCL_OK)
fd10: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
fd20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
fd30: 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d   isStr = (cmd ==
fd40: 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20   C_STRREQ);.    
fd50: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f  switch ((enum co
fd60: 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63  mmand) cmd) {..c
fd70: 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65  ase C_REQ:..case
fd80: 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20   C_STRREQ: {..  
fd90: 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79    EVP_PKEY *pkey
fda0: 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
fdb0: 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20   *cert=NULL;..  
fdc0: 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d    X509_NAME *nam
fdd0: 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c  e=NULL;..    Tcl
fde0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20  _Obj **listv;.. 
fdf0: 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a     int listc,i;.
fe00: 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e  ..    BIO *out=N
fe10: 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20  ULL;...    char 
fe20: 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22  *k_C="",*k_ST=""
fe30: 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22  ,*k_L="",*k_O=""
fe40: 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d  ,*k_OU="",*k_CN=
fe50: 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a  "",*k_Email="";.
fe60: 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75  .    char *keyou
fe70: 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a  t,*pemout,*str;.
fe80: 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65  .    int keysize
fe90: 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33  ,serial=0,days=3
fea0: 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  65;..#if OPENSSL
feb0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
fec0: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
fed0: 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d     BIGNUM *bne =
fee0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20   NULL;..    RSA 
fef0: 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c  *rsa = NULL;.#el
ff00: 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59  se..    EVP_PKEY
ff10: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
ff20: 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69  ;.#endif...    i
ff30: 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28  f ((objc<5) || (
ff40: 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c  objc>6)) {...Tcl
ff50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ff60: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
ff70: 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20  keysize keyfile 
ff80: 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22  certfile ?info?"
ff90: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
ffa0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09  ERROR;..    }...
ffb0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
ffc0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
ffd0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73  , objv[2], &keys
ffe0: 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ize) != TCL_OK) 
fff0: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  {...return TCL_E
10000 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
10010 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74    keyout=Tcl_Get
10020 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
10030 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c  ..    pemout=Tcl
10040 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10050 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73  4]);..    if (is
10060 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  Str) {...Tcl_Set
10070 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
10080 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53  t,"",0);...Tcl_S
10090 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
100a0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20  out,"",0);..    
100b0 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63  }...    if (objc
100c0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c  >=6) {...if (Tcl
100d0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
100e0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  nts(interp, objv
100f0 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20  [5],....&listc, 
10100 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
10110 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
10120 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
10130 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
10140 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
10150 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10160 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
10170 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
10180 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
10190 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
101a0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
101b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
101c0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
101d0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
101e0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
101f0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
10200 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
10210 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
10220 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
10230 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
10240 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
10250 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
10260 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10270 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
10280 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
10290 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
102a0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
102b0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
102c0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
102d0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
102e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
102f0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
10300 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
10310 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
10320 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
10330 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
10340 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
10350 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
10360 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
10370 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
10380 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
10390 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
103a0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
103b0 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
103c0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
103d0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
103e0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
103f0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
10400 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
10410 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
10420 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
10430 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
10440 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
10450 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
10460 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
10470 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
10480 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
10490 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
104a0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
104b0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
104c0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
104d0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
104e0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
104f0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
10500 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
10510 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
10520 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
10530 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
10540 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
10550 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
10560 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
10570 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
10580 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
10590 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
105a0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
105b0 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
105c0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
105d0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
105e0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
105f0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
10600 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
10610 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
10620 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
10630 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
10640 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
10650 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
10660 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
10670 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
10680 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
10690 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
106a0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
106b0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
106c0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
106d0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
106e0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
106f0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
10700 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
10710 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
10720 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
10730 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
10740 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
10750 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
10760 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
10770 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
10780 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
10790 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
107a0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
107b0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
107c0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
107d0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
107e0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
107f0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
10800 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
10810 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
10820 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
10830 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
10840 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
10850 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10860 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
10870 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
10880 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
10890 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
108a0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
108b0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
108c0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
108d0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
108e0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
108f0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
10900 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
10910 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
10920 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
10930 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
10940 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
10950 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
10960 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
10970 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
10980 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
10990 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
109a0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
109b0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
109c0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
109d0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
109e0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
109f0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
10a00 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
10a10 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
10a20 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
10a30 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
10a40 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
10a50 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
10a60 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
10a70 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
10a80 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
10a90 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
10aa0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
10ab0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
10ac0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
10ad0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
10ae0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
10af0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
10b00 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
10b10 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
10b20 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
10b30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
10b40 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
10b50 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
10b60 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
10b70 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76  .}....X509_set_v
10b80 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a  ersion(cert,2);.
10b90 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73  ..ASN1_INTEGER_s
10ba0 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69  et(X509_get_seri
10bb0 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73  alNumber(cert),s
10bc0 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67  erial);...X509_g
10bd0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
10be0 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65  etm_notBefore(ce
10bf0 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67  rt),0);...X509_g
10c00 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
10c10 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72  etm_notAfter(cer
10c20 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32  t),(long)60*60*2
10c30 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f  4*days);...X509_
10c40 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c  set_pubkey(cert,
10c50 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58  pkey);....name=X
10c60 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f  509_get_subject_
10c70 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58  name(cert);....X
10c80 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
10c90 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
10ca0 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  C", MBSTRING_ASC
10cb0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
10cc0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d  d char *) k_C, -
10cd0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
10ce0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
10cf0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54  _by_txt(name,"ST
10d00 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
10d10 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
10d20 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d   char *) k_ST, -
10d30 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
10d40 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
10d50 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22  _by_txt(name,"L"
10d60 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
10d70 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
10d80 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c  char *) k_L, -1,
10d90 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
10da0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
10db0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20  y_txt(name,"O", 
10dc0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
10dd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10de0 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d  ar *) k_O, -1, -
10df0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
10e00 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
10e10 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d  txt(name,"OU", M
10e20 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
10e30 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10e40 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d  r *) k_OU, -1, -
10e50 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
10e60 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
10e70 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d  txt(name,"CN", M
10e80 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
10e90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10ea0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d  r *) k_CN, -1, -
10eb0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
10ec0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
10ed0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22  txt(name,"Email"
10ee0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
10ef0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
10f00 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c  char *) k_Email,
10f10 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09   -1, -1, 0);....
10f20 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74  X509_set_subject
10f30 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29  _name(cert,name)
10f40 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73  ;....if (!X509_s
10f50 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56  ign(cert,pkey,EV
10f60 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09  P_sha256())) {..
10f70 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63  .    X509_free(c
10f80 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f  ert);...    EVP_
10f90 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
10fa0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
10fb0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
10fc0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20  30000000L...    
10fd0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
10fe0 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53  ndif...    Tcl_S
10ff0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11000 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63  "Error signing c
11010 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c  ertificate",NULL
11020 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
11030 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
11040 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
11050 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
11060 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
11070 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
11080 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
11090 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
110a0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
110b0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
110c0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
110d0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
110e0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
110f0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
11100 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75  interp,pemout,bu
11110 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
11120 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
11130 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
11140 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
11150 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
11160 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
11170 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
11180 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d  filename(out,pem
11190 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
111a0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
111b0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
111c0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
111d0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66  );...}....X509_f
111e0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50  ree(cert);...EVP
111f0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
11200 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
11210 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
11220 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f  x30000000L...BN_
11230 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
11240 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65  f..    }..}..bre
11250 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
11260 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ..break;.    }. 
11270 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
11280 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
11290 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
112a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
112b0 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20  *****/./* Init  
112c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a             */./*
112d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112e0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
112f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11330 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
11340 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
11350 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
11360 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
11370 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
11380 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
11390 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
113a0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
113b0 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
113c0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
113d0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
113e0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
113f0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
11440 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
11450 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20  char *blockPtr) 
11460 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
11470 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
11480 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20  )blockPtr;..    
11490 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
114a0 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61  );..    Tls_Clea
114b0 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
114c0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72   ckfree(blockPtr
114d0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11520 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20   *. * Tls_Clean 
11530 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
11540 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
11550 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
11560 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
11570 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
11580 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
11590 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
115a0 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75  ow 1.  This shou
115b0 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20  ld. *.be called 
115c0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79  synchronously by
115d0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20   the CloseProc, 
115e0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76  not in the. *.Ev
115f0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c  entuallyFree cal
11600 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
11610 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
11620 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
11630 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
11640 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
11650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11690 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43  -. */.void Tls_C
116a0 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74  lean(State *stat
116b0 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69  ePtr) {.    dpri
116c0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
116d0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65      /*.     * we
116e0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72  're assuming her
116f0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e  e that we're sin
11700 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20  gle-threaded.   
11710 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61    */.    if (sta
11720 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
11730 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
11740 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
11750 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
11760 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
11770 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
11780 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  mer = NULL;.    
11790 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
117a0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09  Ptr->protos) {..
117b0 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  ckfree(statePtr-
117c0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65  >protos);..state
117d0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
117e0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
117f0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
11800 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
11810 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
11820 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
11830 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
11840 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
11850 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
11860 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
11870 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
11880 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
11890 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
118a0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
118b0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53  ) {..dprintf("SS
118c0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61  L_free(%p)", sta
118d0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53  tePtr->ssl);..SS
118e0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  L_free(statePtr-
118f0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72  >ssl);..statePtr
11900 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ssl = NULL;.  
11910 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
11920 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53  ePtr->ctx) {..SS
11930 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  L_CTX_free(state
11940 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74  Ptr->ctx);..stat
11950 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
11960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11970 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
11980 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
11990 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
119a0 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
119b0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
119c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
119d0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
119e0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
119f0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
11a00 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
11a10 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
11a20 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
11a30 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
11a40 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
11a50 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
11aa0 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
11ab0 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
11ac0 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
11ad0 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
11ae0 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
11af0 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
11b00 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
11b10 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11b20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
11b30 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
11b40 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
11b50 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
11b60 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
11b70 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
11b80 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
11b90 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
11ba0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c  ---------. */.DL
11bf0 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
11c00 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
11c10 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63  *interp) {.    c
11c20 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
11c30 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
11c40 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
11c50 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
11c60 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  };..    dprintf(
11c70 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
11c80 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  /*.     * We onl
11c90 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e  y support Tcl 8.
11ca0 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20  4 or newer.     
11cb0 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64  */.    if (.#ifd
11cc0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
11cd0 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  ..Tcl_InitStubs(
11ce0 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
11cf0 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67  ).#else..Tcl_Pkg
11d00 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
11d10 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30  "Tcl", "8.4-", 0
11d20 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55  ).#endif.. == NU
11d30 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
11d40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
11d50 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e      if (TlsLibIn
11d60 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
11d70 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
11d80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
11d90 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
11da0 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
11db0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
11dc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11dd0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
11de0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
11df0 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  p, "tls::ciphers
11e00 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
11e10 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
11e20 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
11e30 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
11e40 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
11e50 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
11e60 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
11e70 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
11e80 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
11e90 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
11ea0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
11eb0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
11ec0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
11ed0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
11ee0 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
11ef0 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
11f00 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
11f10 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
11f20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
11f30 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
11f40 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d  interp, "tls::im
11f50 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
11f60 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
11f70 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
11f80 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
11f90 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
11fa0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
11fb0 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72  p, "tls::unimpor
11fc0 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
11fd0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
11fe0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
11ff0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
12000 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
12010 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
12020 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  , "tls::status",
12030 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28   StatusObjCmd, (
12040 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
12050 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
12060 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
12070 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
12080 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
12090 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
120a0 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
120b0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
120c0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
120d0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
120e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
120f0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
12100 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d  misc", MiscObjCm
12110 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
12120 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
12130 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
12140 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
12150 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
12160 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
12170 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  ", ProtocolsObjC
12180 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
12190 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
121a0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
121b0 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
121c0 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e  ) {..Tcl_Eval(in
121d0 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
121e0 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a  Script);.    }..
121f0 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50      return(Tcl_P
12200 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
12210 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45  , "tls", PACKAGE
12220 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f  _VERSION));.}../
12230 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
12270 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d  *.Tls_SafeInit -
12280 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
12290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
122a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
122b0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61  --------*. *.Sta
122c0 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20  ndard procedure 
122d0 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61  required by 'loa
122e0 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  d'.. *.Initializ
122f0 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f  es this extensio
12300 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74  n for a safe int
12310 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d  erpreter.. *.---
12320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
12350 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
12360 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c  s:. *..As of 'Tl
12370 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65  s_Init'. *. *.Re
12380 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e  sult:. *..A stan
12390 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63  dard Tcl error c
123a0 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ode.. *. *------
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123e0 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  *. */.DLLEXPORT 
123f0 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74  int Tls_SafeInit
12400 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
12410 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e  erp) {.    dprin
12420 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20  tf("Called");.  
12430 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69    return(Tls_Ini
12440 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f  t(interp));.}../
12450 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
12490 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a  *.TlsLibInit --.
124a0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124d0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69  ------*. *.Initi
124e0 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
124f0 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
12500 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d  ication. *.-----
12510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
12540 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
12550 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73  . *..initializes
12560 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a   SSL library. *.
12570 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e   *.Result:. *..n
12580 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
12590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
125c0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
125d0 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75  TlsLibInit(int u
125e0 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20  ninitialize) {. 
125f0 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e     static int in
12600 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20  itialized = 0;. 
12610 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20     int status = 
12620 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  TCL_OK;.#if defi
12630 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
12640 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
12650 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
12660 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b   size_t num_lock
12670 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  s;.#endif..    i
12680 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  f (uninitialize)
12690 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21   {.        if (!
126a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20  initialized) {. 
126b0 20 20 20 20 20 20 20 20 20 20 20 64 70 72 69 6e             dprin
126c0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
126d0 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
126e0 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
126f0 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20 20 20  lized");..      
12700 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c        return(TCL
12710 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _OK);.        }.
12720 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66  .        dprintf
12730 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69  ("Asked to unini
12740 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20  tialize");..#if 
12750 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
12760 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
12770 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
12780 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74  .        Tcl_Mut
12790 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
127a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c  ;..        if (l
127b0 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ocks) {.        
127c0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
127d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
127e0 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ks = NULL;.     
127f0 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e         locksCoun
12800 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
12810 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
12820 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
12830 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
12840 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
12850 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
12860 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54  READS).        T
12870 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
12880 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
12890 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
128a0 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a  (TCL_OK);.    }.
128b0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c  .    if (initial
128c0 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20  ized) {.        
128d0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
128e0 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
128f0 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20  d value");.     
12900 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73     return(status
12910 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  );.    }..    dp
12920 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
12930 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
12940 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
12950 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
12960 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d  READS).    Tcl_M
12970 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
12980 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  x);.#endif.    i
12990 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
129a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
129b0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
129c0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
129d0 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f  EADS).    num_lo
129e0 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  cks = 1;.    loc
129f0 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20  ksCount = (int) 
12a00 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c  num_locks;.    l
12a10 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  ocks = malloc(si
12a20 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
12a30 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d  um_locks);.    m
12a40 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20  emset(locks, 0, 
12a50 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
12a60 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e   num_locks);.#en
12a70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  dif..    /* Init
12a80 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63  ialize BOTH libc
12a90 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c  rypto and libssl
12aa0 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c  . */.    OPENSSL
12ab0 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53  _init_ssl(OPENSS
12ac0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f  L_INIT_LOAD_SSL_
12ad0 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53  STRINGS | OPENSS
12ae0 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50  L_INIT_LOAD_CRYP
12af0 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50  TO_STRINGS..| OP
12b00 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
12b10 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45  LL_CIPHERS | OPE
12b20 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
12b30 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29  L_DIGESTS, NULL)
12b40 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74  ;..    BIO_new_t
12b50 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69  cl(NULL, 0);..#i
12b60 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  f 0.    /*.     
12b70 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f  * XXX:TODO: Remo
12b80 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64  ve this code and
12b90 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
12ba0 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20   a check.     * 
12bb0 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f  for enough entro
12bc0 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72  py and do not tr
12bd0 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  y to create our 
12be0 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69  own.     * terri
12bf0 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20  ble entropy.    
12c00 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   */.    /*.     
12c10 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f  * Seed the rando
12c20 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
12c30 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69  or in the SSL li
12c40 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73  brary,.     * us
12c50 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65  ing the do/while
12c60 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75   construct becau
12c70 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f  se of the bug no
12c80 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a  te in the.     *
12c90 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20   OpenSSL FAQ at 
12ca0 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73  http://www.opens
12cb0 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66  sl.org/support/f
12cc0 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20  aq.html#USER1.  
12cd0 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20     *.     * The 
12ce0 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62  crux of the prob
12cf0 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61  lem is that Sola
12d00 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68  ris 7 does not h
12d10 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65  ave a.     * /de
12d20 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76  v/random or /dev
12d30 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20  /urandom device 
12d40 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74  so it cannot gat
12d50 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20  her enough.     
12d60 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74  * entropy from t
12d70 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77  he RAND_seed() w
12d80 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69  hen TLS initiali
12d90 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a  zes and refuses.
12da0 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72       * to go fur
12db0 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65  ther. Earlier ve
12dc0 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53  rsions of OpenSS
12dd0 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67  L carried on reg
12de0 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f  ardless..     */
12df0 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69  .    srand((unsi
12e00 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28  gned int) time((
12e10 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29  time_t *) NULL))
12e20 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20  ;.    do {..for 
12e30 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20  (i = 0; i < 16; 
12e40 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f  i++) {..    rnd_
12e50 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63  seed[i] = 1 + (c
12e60 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61  har) (255.0 * ra
12e70 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31  nd()/(RAND_MAX+1
12e80 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73  .0));..}..RAND_s
12e90 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69  eed(rnd_seed, si
12ea0 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b  zeof(rnd_seed));
12eb0 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41  .    } while (RA
12ec0 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31  ND_status() != 1
12ed0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  );.#endif..#if d
12ee0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
12ef0 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
12f00 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
12f10 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
12f20 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
12f30 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74  if...return(stat
12f40 75 73 29 3b 0a 7d 0a                             us);.}.